Collaborators: Shane Blowes, Jon Chase, Helmut Hillebrand, Michael Burrows, Amanda Bates, Uli Brose, Benoit Gauzens, Laura Antao Assistance: Katherine Lew, Josef Hauser

Introduction

Methods

library(data.table) # for handling large datasets
library(ggplot2) # for some plotting
#library(lme4)
library(nlme) # for ME models
library(beanplot) # for beanplots
library(maps) # for map
library(ggeffects) # marginal effect plots
library(gridExtra) # to combine ggplots together
library(grid) # to combine ggplots together
library(gridExtra)

options(width=500) # turn off most text wrapping

# tell RStudio to use project root directory as the root for this notebook. Needed since we are storing code in a separate directory.
knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) 
# Turnover and covariates assembled by turnover_vs_temperature_prep.Rmd
trends <- fread('output/turnover_w_covariates.csv.gz')

# set realm order
trends[, REALM := factor(REALM, levels = c('Freshwater', 'Marine', 'Terrestrial'), ordered = FALSE)]

# group Marine invertebrates/plants in with All
trends[, taxa_mod2 := taxa_mod]
trends[taxa_mod == 'Marine invertebrates/plants', taxa_mod2 := 'All']

Log-transform some variables, then center and scale.

trends[, tempave.sc := scale(tempave)]
trends[, tempave_metab.sc := scale(tempave_metab)]
trends[, seas.sc := scale(seas)]
trends[, microclim.sc := scale(log(microclim))]
trends[, temptrend.sc := scale(temptrend)]
trends[, temptrend_abs.sc := scale(log(abs(temptrend)))]
trends[, npp.sc := scale(log(npp))]
trends[, mass.sc := scale(log(mass_mean_weight))]
trends[, speed.sc := scale(log(speed_mean_weight+1))]
trends[, lifespan.sc := scale(log(lifespan_mean_weight))]
trends[, thermal_bias.sc := scale(thermal_bias)]
trends[, consumerfrac.sc := scale(consfrac)]
trends[, endothermfrac.sc := scale(endofrac)]
trends[, nspp.sc := scale(log(Nspp))]
trends[, human.sc := scale(human)]

Do the variables look ok?

# histograms to examine
cexmain = 0.6
par(mfrow = c(3,5))
invisible(trends[, hist(tempave.sc, main = 'Environmental temperature (°C)', cex.main = cexmain)])
invisible(trends[, hist(tempave_metab.sc, main = 'Metabolic temperature (°C)', cex.main = cexmain)])
invisible(trends[, hist(seas.sc, main = 'Seasonality (°C)', cex.main = cexmain)])
invisible(trends[, hist(microclim.sc, main = 'log Microclimates (°C)', cex.main = cexmain)])
invisible(trends[, hist(temptrend.sc, main = 'Temperature trend (°C/yr)', cex.main = cexmain)])
invisible(trends[, hist(temptrend_abs.sc, main = 'log abs(Temperature trend) (°C/yr)', cex.main = cexmain)])
invisible(trends[, hist(mass.sc, main = 'log Mass (g)', cex.main = cexmain)])
invisible(trends[, hist(speed.sc, main = 'log Speed (km/hr)', cex.main = cexmain)])
invisible(trends[, hist(lifespan.sc, main = 'log Lifespan (yr)', cex.main = cexmain)])
invisible(trends[, hist(consumerfrac.sc, main = 'Consumers (fraction)', cex.main = cexmain)])
invisible(trends[, hist(endothermfrac.sc, main = 'Endotherms (fraction)', cex.main = cexmain)])
invisible(trends[, hist(nspp.sc, main = 'log Species richness', cex.main = cexmain)])
invisible(trends[, hist(thermal_bias.sc, main = 'Thermal bias (°C)', cex.main = cexmain)])
invisible(trends[, hist(npp.sc, main = 'log Net primary productivity', cex.main = cexmain)])
invisible(trends[, hist(human.sc, main = 'Human impact score', cex.main = cexmain)])

Check correlations among variables. Pearson’s r is on the lower diagonal.

panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- cor(x, y, use = 'pairwise.complete.obs')
    txt <- format(c(r, 0.123456789), digits = digits)[1]
    txt <- paste0(prefix, txt)
    if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
    text(0.5, 0.5, txt) #, cex = cex.cor * r)
}
pairs(formula = ~ REALM + tempave.sc + tempave_metab.sc + seas.sc + microclim.sc + temptrend.sc + temptrend_abs.sc +  mass.sc + speed.sc + lifespan.sc + consumerfrac.sc + endothermfrac.sc + nspp.sc + thermal_bias.sc + npp.sc + human.sc, data = trends, gap = 1/10, cex = 0.2, col = '#00000022', lower.panel = panel.cor)

Mass and lifespan look tightly correlated, but r only 0.56…? Tempave_metab and lifespan don’t look tightly correlated, but r= -0.81 Tempave_metab and speed don’t look tightly correlated, but r= -0.83 Lifespan and speed don’t look tightly correlated, but r = 0.73

Examine how many data points are available

Just turnover

cat('Overall # time-series: ', nrow(trends), '\n')
Overall # time-series:  53013 
cat('# studies: ', trends[, length(unique(STUDY_ID))], '\n')
# studies:  332 
cat('Data points: ', trends[, sum(nyrBT)], '\n')
Data points:  293973 
trends[, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
       1025       48647        3341 
trends[, table(taxa_mod)]
taxa_mod
                        All                  Amphibians                     Benthos                       Birds 
                       1705                         379                        4679                       13741 
                       Fish               Invertebrates                     Mammals Marine invertebrates/plants 
                      28473                        2996                         525                         206 
                      Plant                    Reptiles 
                        305                           4 
trends[, table(taxa_mod, REALM)]
                             REALM
taxa_mod                      Freshwater Marine Terrestrial
  All                                  0   1702           3
  Amphibians                           2      0         377
  Benthos                              0   4679           0
  Birds                                0  11099        2642
  Fish                              1006  27467           0
  Invertebrates                       15   2901          80
  Mammals                              0    478          47
  Marine invertebrates/plants          0    206           0
  Plant                                1    115         189
  Reptiles                             1      0           3

With all covariates

# the cases we can compare
apply(trends[, .(Jtutrend, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, temptrend.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, human.sc)], MARGIN = 2, FUN = function(x) sum(!is.na(x)))
        Jtutrend            REALM       tempave.sc tempave_metab.sc          seas.sc     microclim.sc 
           53013            53013            49916            49916            49916            51834 
    temptrend.sc          mass.sc         speed.sc      lifespan.sc  consumerfrac.sc endothermfrac.sc 
           49916            52820            52689            51540            47534            53013 
         nspp.sc  thermal_bias.sc           npp.sc         human.sc 
           53013            49371            52863            53013 
i <- trends[, complete.cases(Jtutrend, temptrend.sc, tempave_metab.sc, REALM, seas.sc, microclim.sc, npp.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, thermal_bias.sc)]
cat('Overall # time-series: ', sum(i), '\n')
Overall # time-series:  43585 
cat('# studies: ', trends[i, length(unique(STUDY_ID))], '\n')
# studies:  250 
cat('Data points: ', trends[i, sum(nyrBT)], '\n')
Data points:  222824 
trends[i, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
       1008       39735        2842 
trends[i, table(taxa_mod)]
taxa_mod
          All    Amphibians       Benthos         Birds          Fish Invertebrates       Mammals         Plant 
          521            12           590         11803         27372          2567           518           200 
     Reptiles 
            2 
trends[i, table(taxa_mod, REALM)]
               REALM
taxa_mod        Freshwater Marine Terrestrial
  All                    0    520           1
  Amphibians             2      0          10
  Benthos                0    590           0
  Birds                  0   9221        2582
  Fish                 993  26379           0
  Invertebrates         12   2484          71
  Mammals                0    477          41
  Plant                  1     64         135
  Reptiles               0      0           2

Choose the variance structure for mixed effects modles

Try combinations of

  • variance scaled to a power of the number of years in the community time-series
  • variance scaled to a power of the abs temperature trend
  • random intercept for taxa_mod
  • random intercept for STUDY_ID
  • random slope (abs temperature trend) for taxa_mod
  • random slope (abs temperature trend) for STUDY_ID
  • random intercept for rarefyID (for overdispersion)

And choose the one with lowest AIC (not run: takes a long time)

# fit models for variance structure
fixed <- formula(Jtutrend ~ REALM + tempave_metab.sc + seas.sc + microclim.sc + npp.sc + temptrend_abs.sc +
                     mass.sc + speed.sc + lifespan.sc + consumerfrac.sc + thermal_bias.sc)
i <- trends[, complete.cases(Jtutrend, REALM, tempave_metab.sc, seas.sc, microclim.sc, npp.sc, temptrend_abs.sc,
                             mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, thermal_bias.sc)]
mods <- vector('list', 0)
mods[[1]] <- gls(fixed, data = trends[i,])
mods[[2]] <- gls(fixed, data = trends[i,], weights = varPower(-0.5, ~nyrBT))
mods[[3]] <- gls(fixed, data = trends[i,], weights = varPower(0.5, ~ abs(temptrend)))

mods[[4]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2, control = lmeControl(opt = "optim"))
mods[[5]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID, control = lmeControl(opt = "optim"))
mods[[6]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID, control = lmeControl(opt = "optim"))
mods[[7]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))
mods[[8]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))

mods[[9]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc | taxa_mod)
mods[[10]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc | STUDY_ID)
mods[[11]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc | taxa_mod2/STUDY_ID, control = lmeControl(opt = "optim"))
mods[[12]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)) # includes overdispersion. new formula so that random slope is only for study level (not enough data to extend to rarefyID).
mods[[13]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)) # 30+ min to fit

mods[[14]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID, weights = varPower(-0.5, ~nyrBT))
mods[[15]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2, weights = varPower(-0.5, ~nyrBT))
mods[[16]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID, weights = varPower(-0.5, ~nyrBT))
mods[[17]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID/rarefyID, weights = varPower(-0.5, ~nyrBT))
mods[[18]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID/rarefyID, weights = varPower(-0.5, ~nyrBT))
mods[[19]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc|STUDY_ID, weights = varPower(-0.5, ~nyrBT))
mods[[20]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))
mods[[21]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ 1), weights = varPower(-0.5, ~nyrBT))
mods[[22]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ 1, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))
mods[[23]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ temptrend_abs.sc), weights = varPower(-0.5, ~nyrBT)) # singular precision warning with lmeControl(opt = 'optim') and convergence error without
mods[[24]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT)) # singular precision warning with lmeControl(opt = 'optim') and convergence error without

mods[[25]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2, weights = varPower(-0.5, ~abs(temptrend)))
mods[[26]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID, weights = varPower(-0.5, ~abs(temptrend)))
mods[[27]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID/rarefyID, weights = varPower(-0.5, ~abs(temptrend)))
mods[[28]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID/rarefyID, weights = varPower(-0.5, ~abs(temptrend)))
mods[[29]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc|STUDY_ID, weights = varPower(-0.5, ~abs(temptrend)))
mods[[30]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc|taxa_mod2/STUDY_ID, weights = varPower(-0.5, ~abs(temptrend)), control = lmeControl(opt = "optim"))
mods[[31]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~abs(temptrend)))
mods[[32]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~abs(temptrend)), control = lmeControl(opt = "optim")) # singular precision warning

aics <- sapply(mods, AIC)
minaics <- aics - min(aics)
minaics
which.min(aics)

Chooses the random slopes (temptrend_abs) & intercepts for STUDY_ID, overdispersion, and variance scaled to number of years. We haven’t dealt with potential testing on the boundary issues here yet.

Results

Where do we have data?

world <- map_data('world')
ggplot(world, aes(x = long, y = lat, group = group)) +
    geom_polygon(fill = 'lightgray', color = 'white') +
    geom_point(data = trends, aes(rarefyID_x, rarefyID_y, group = REALM, color = REALM), size = 0.5, alpha = 0.4)  +
    scale_color_brewer(palette="Set1", name = 'Realm') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=16),
        axis.title=element_text(size=20)) +
  labs(x = 'Longitude (°)', y = 'Latitude (°)')

Mostly northern hemisphere, but spread all over. No so much in Africa or much of Asia.

Plot turnover vs. explanatory variables

Lines are ggplot smoother fits by realm.

Strong trends with temperature change, but trends are pretty symmetric around no trend in temperature, which implies warming or cooling drives similar degree of community turnover. Some indication of less turnover for larger organisms (mass) Higher turnover on land with higher seasonality? More turnover for shorter-lived organisms? No really clear differences among realms.

Average rates of turnover

trends[abs(temptrend) >= 0.5, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # turnover per year for locations changing temperature
trends[abs(temptrend) < 0.1, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # not changing temperature
trends[temptrend >= 0.5, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # warming
trends[temptrend <= -0.5, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # cooling

trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) < 35, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # tropics and sub-tropics
trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) >= 35 & abs(rarefyID_y) < 66.56339, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # temperate
trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) >= 66.56339, .(mean(Jtutrend), sd(Jtutrend)/sqrt(.N))] # arctic

Hexagonal bins

require(ggplot2)
ggplot(trends[REALM == 'Terrestrial',], aes(temptrend, Jtutrend)) +
  geom_hex() + 
  scale_fill_gradient(trans = "log")

ggplot(trends[REALM == 'Marine',], aes(temptrend, Jtutrend)) +
  geom_hex() + 
  scale_fill_gradient(trans = "log")

ggplot(trends[REALM == 'Freshwater',], aes(temptrend, Jtutrend)) +
  geom_hex() + 
  scale_fill_gradient(trans = "log")

Compare covariates across realms

i <- trends[, !duplicated(rarefyID)]; sum(i)
par(mfrow=c(5,3))
beanplot(rarefyID_y ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Latitude (degN)', ll = 0.05)
beanplot(tempave ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Temperature (degC)', ll = 0.05)
beanplot(tempave_metab ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Metabolic Temperature (degC)', ll = 0.05, bw = 'nrd0') # nrd0 bandwidth to calculation gap
beanplot(seas ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Seasonality (degC)', ll = 0.05)
beanplot(microclim ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Microclimates (degC)', ll = 0.05)
beanplot(temptrend ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Temperature trend (degC/yr)', ll = 0.05)
beanplot(mass_mean_weight ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Mass (g)', ll = 0.05, log = 'y')
beanplot(speed_mean_weight +1 ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Speed (km/hr)', ll = 0.05, log = 'y')
beanplot(lifespan_mean_weight ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Lifespan (yr)', ll = 0.05, log = 'y')
#beanplot(consfrac ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Consumers (fraction)', ll = 0.05, log = '') # too sparse
#beanplot(endofrac ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Endotherms (fraction)', ll = 0.05, log = '') # too sparse
beanplot(Nspp ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Number of species', ll = 0.05, log = 'y')
beanplot(thermal_bias ~ REALM, data = trends[i & !is.na(thermal_bias),], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Thermal bias (degC)', ll = 0.05)
beanplot(npp ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'NPP', ll = 0.05)
beanplot(human ~ REALM, data = trends[i,], what = c(1,1,1,1), col = c("#CAB2D6", "#33A02C", "#B2DF8A"), border = "#CAB2D6", ylab = 'Human impact score', ll = 0.05)

Marine are in generally warmer locations (seawater doesn’t freeze) Marine have much lower seasonality. Marine and freshwater have some very small masses (plankton), but much of dataset is similar to terrestrial. Marine has a lot of slow, crawling organisms, but land has plants. Land also has birds (fast).

Temperature-only model (Jtutrend, Jbetatrend, Horntrend)

summary(modonlyTtrend)
Linear mixed-effects model fit by REML
 Data: trends[i, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.04460504 (Intr)
temptrend_abs.sc 0.01904043 0.156 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.001713667 0.2946268

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
   power 
-1.23577 
Fixed effects: Jtutrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.175                                
REALMMarine                     -0.928  0.162                         
REALMTerrestrial                -0.928  0.162  0.861                  
abs(temptrend):REALMMarine       0.173 -0.990 -0.164 -0.161           
abs(temptrend):REALMTerrestrial  0.172 -0.984 -0.160 -0.166  0.974    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.46254351 -0.30730773  0.08443652  0.54660915  6.61661896 

Number of Observations: 49916
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   317                  49916 
summary(modonlyTtrendJbeta)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05659393 (Intr)
temptrend_abs.sc 0.02520050 0.021 

 Formula: ~1 | rarefyID %in% STUDY_ID
         (Intercept)  Residual
StdDev: 1.693577e-06 0.3590015

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.413558 
Fixed effects: Jbetatrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.160                                
REALMMarine                     -0.928  0.148                         
REALMTerrestrial                -0.931  0.149  0.864                  
abs(temptrend):REALMMarine       0.158 -0.991 -0.150 -0.147           
abs(temptrend):REALMTerrestrial  0.157 -0.986 -0.146 -0.151  0.976    

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-7.8997139 -0.1696297  0.2037637  0.6704994  6.6449583 

Number of Observations: 49916
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   317                  49916 
summary(modonlyTtrendHorn)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05792109 (Intr)
temptrend_abs.sc 0.02134495 0.134 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev: 0.007146559 0.306766

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.217277 
Fixed effects: Horntrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.154                                
REALMMarine                     -0.914  0.141                         
REALMTerrestrial                -0.925  0.143  0.845                  
abs(temptrend):REALMMarine       0.153 -0.989 -0.142 -0.141           
abs(temptrend):REALMTerrestrial  0.152 -0.984 -0.139 -0.146  0.973    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.16836348 -0.32501087  0.06399723  0.53830958  5.96234033 

Number of Observations: 48800
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   276                  48800 

Try simplifying the temp-only models

if(file.exists('temp/modonlyTtrendsimpreml.rds')){
  modonlyTtrendsimpreml <- readRDS('temp/modonlyTtrendsimpreml.rds')
} else {
  require(MASS) # for stepAIC
  modonlyTtrendml <- update(modonlyTtrend, method = 'ML')
  modonlyTtrendsimp <- stepAIC(modonlyTtrendml, direction = 'backward')
  modonlyTtrendsimpreml <- update(modonlyTtrendsimp, method = 'REML')
  saveRDS(modonlyTtrendsimpreml, file = 'temp/modonlyTtrendsimpreml.rds')
}


if(file.exists('temp/modonlyTtrendJbetasimpreml.rds')){
  modonlyTtrendJbetasimpreml <- readRDS('temp/modonlyTtrendJbetasimpreml.rds')
} else {
  require(MASS) # for stepAIC
  modonlyTtrendJbetaml <- update(modonlyTtrendJbeta, method = 'ML')
  modonlyTtrendJbetasimp <- stepAIC(modonlyTtrendJbetaml, direction = 'backward')
  modonlyTtrendJbetasimpreml <- update(modonlyTtrendJbetasimp, method = 'REML')
  saveRDS(modonlyTtrendJbetasimpreml, file = 'temp/modonlyTtrendJbetasimpreml.rds')
}
Start:  AIC=-165090
Jbetatrend ~ abs(temptrend) * REALM

                       Df     AIC
<none>                    -165090
- abs(temptrend):REALM  2 -164091
if(file.exists('temp/modonlyTtrendHornsimpreml.rds')){
  modonlyTtrendHornsimpreml <- readRDS('temp/modonlyTtrendHornsimpreml.rds')
} else {
  require(MASS) # for stepAIC
  modonlyTtrendHornml <- update(modonlyTtrendHorn, method = 'ML')
  modonlyTtrendHornsimp <- stepAIC(modonlyTtrendHornml, direction = 'backward')
  modonlyTtrendHornsimpreml <- update(modonlyTtrendHornsimp, method = 'REML')
  saveRDS(modonlyTtrendHornsimpreml, file = 'temp/modonlyTtrendHornsimpreml.rds')
}
Start:  AIC=-146055.2
Horntrend ~ abs(temptrend) * REALM

                       Df     AIC
<none>                    -146055
- abs(temptrend):REALM  2 -145334
summary(modonlyTtrendsimpreml)
Linear mixed-effects model fit by REML
 Data: trends[i, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.04460504 (Intr)
temptrend_abs.sc 0.01904043 0.156 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.001713667 0.2946268

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
   power 
-1.23577 
Fixed effects: Jtutrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.175                                
REALMMarine                     -0.928  0.162                         
REALMTerrestrial                -0.928  0.162  0.861                  
abs(temptrend):REALMMarine       0.173 -0.990 -0.164 -0.161           
abs(temptrend):REALMTerrestrial  0.172 -0.984 -0.160 -0.166  0.974    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.46254351 -0.30730773  0.08443652  0.54660915  6.61661896 

Number of Observations: 49916
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   317                  49916 
summary(modonlyTtrendJbetasimpreml)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05659393 (Intr)
temptrend_abs.sc 0.02520050 0.021 

 Formula: ~1 | rarefyID %in% STUDY_ID
         (Intercept)  Residual
StdDev: 1.693577e-06 0.3590015

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.413558 
Fixed effects: Jbetatrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.160                                
REALMMarine                     -0.928  0.148                         
REALMTerrestrial                -0.931  0.149  0.864                  
abs(temptrend):REALMMarine       0.158 -0.991 -0.150 -0.147           
abs(temptrend):REALMTerrestrial  0.157 -0.986 -0.146 -0.151  0.976    

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-7.8997139 -0.1696297  0.2037637  0.6704994  6.6449583 

Number of Observations: 49916
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   317                  49916 
summary(modonlyTtrendHornsimpreml)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05792109 (Intr)
temptrend_abs.sc 0.02134495 0.134 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev: 0.007146559 0.306766

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.217277 
Fixed effects: Horntrend ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.154                                
REALMMarine                     -0.914  0.141                         
REALMTerrestrial                -0.925  0.143  0.845                  
abs(temptrend):REALMMarine       0.153 -0.989 -0.142 -0.141           
abs(temptrend):REALMTerrestrial  0.152 -0.984 -0.139 -0.146  0.973    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.16836348 -0.32501087  0.06399723  0.53830958  5.96234033 

Number of Observations: 48800
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   276                  48800 

Plot the temp-only coefficients

# make table of coefficients
coefs <- as.data.frame(summary(modonlyTtrend)$tTable)
coefs2 <- as.data.frame(summary(modonlyTtrendJbeta)$tTable)
coefs3 <- as.data.frame(summary(modonlyTtrendHorn)$tTable)
coefs$mod <- 'Jtu'
coefs2$mod <- 'Jbeta'
coefs3$mod <- 'Horn'
rows1 <- which(grepl('temptrend', rownames(coefs))) # extract temperature effect
cols <- c('Value', 'Std.Error', 'mod')
allcoefs <- rbind(coefs[rows1, cols], coefs2[rows1, cols], coefs3[rows1, cols])
allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] <- allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to marine effects
allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] <- allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to marine effects

allcoefs$lCI <- allcoefs$Value - allcoefs$Std.Error # lower confidence interval
allcoefs$uCI <- allcoefs$Value + allcoefs$Std.Error
allcoefs$y <- c(3, 2, 1, 2.9, 1.9, 0.9, 2.8, 1.8, 0.8) # y-values
allcoefs$col <- c(rep('black', 3), rep('light grey', 3), rep('dark grey', 3))
allcoefs$realm <- rep(c('Freshwater', 'Marine', 'Terrestrial'), 3)

par(las = 1, mai = c(0.8, 2, 0.1, 0.1))
plot(0,0, col = 'white', xlim=c(-0.02, 0.85), ylim = c(0.7,3), 
     yaxt='n', xlab = 'Turnover per |°C/yr|', ylab ='')
axis(2, at = 3:1, labels = c('Freshwater', 'Marine', 'Terrestrial'), cex.axis = 0.7)
abline(v = 0, col = 'grey')
for(i in 1:nrow(allcoefs)){
  with(allcoefs[i, ], points(Value, y, pch = 16, col = col))
  with(allcoefs[i, ], lines(x = c(lCI, uCI), y = c(y, y), col = col))
}
legend('bottomright', col = c('black', 'dark grey', 'light grey'), lwd = 1, pch = 16, 
       legend = c('Jaccard turnover', 'Jaccard total', 'Horn-Morisita'))

Nicer plots of turnover vs. temperature data and model fit

Scatterplot, violin plots, and coefficient plots all together

trends[temptrend <= -0.5, temptrendtext := 'Cooling']
trends[abs(temptrend) <= 0.1, temptrendtext := 'Stable']
trends[temptrend >= 0.5, temptrendtext := 'Warming']

trends[abs(rarefyID_y) < 35, latzone := 'Subtropics']
trends[abs(rarefyID_y) >= 35 & abs(rarefyID_x) < 66.56339, latzone := 'Temperate'] 
trends[abs(rarefyID_y) >= 66.56339, latzone := 'Polar']
trends[, latzone := factor(latzone, levels = c('Subtropics', 'Temperate', 'Polar'))]

p1 <- ggplot(trends, aes(temptrend, Jtutrend, color = REALM, fill = REALM, size = nyrBT)) +
  geom_point(na.rm = TRUE, shape = 16, alpha = 0.1) + 
  geom_smooth(data=subset(trends, abs(temptrend) < 0.75), method = 'gam', formula = y ~ s(x, bs = "cs"), 
              na.rm = TRUE) +
  scale_color_brewer(palette="Set1", name = 'Realm') + 
  scale_fill_brewer(palette="Set1", name = 'Realm') + 
  labs(x = 'Temperature trend (°C/yr)', y = 'Jaccard turnover', tag = 'A') +
  scale_size_continuous(range = c(1, 8), breaks = c(2, 5, 20)) +
  guides(size = guide_legend(title = 'Years',
                             override.aes = list(linetype=0, fill = NA, alpha = 1))) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        legend.key.size = unit(0.5,"line"), 
        axis.text=element_text(size=8),
        axis.title=element_text(size=10))

p2 <- ggplot(trends[!is.na(temptrendtext), ], aes(temptrendtext, Jtutrend)) +
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), fill = 'grey') +
  labs(x = '', y = 'Jaccard turnover', tag = 'B') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=8),
        axis.title=element_text(size=10))

p3 <- ggplot(trends[abs(temptrend) >= 0.5 & !is.na(latzone), ], aes(latzone, Jtutrend)) +
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), fill = 'grey') + 
  labs(x = '', y = '', tag = 'C') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=7),
        axis.title=element_text(size=10))

p4 <- ggplot(allcoefs, aes(Value, y, group = mod, color = mod)) +
  geom_errorbarh(aes(xmin = lCI, xmax = uCI, height = 0)) + 
  geom_point() + 
  labs(x = expression(atop('Temperature change effect', '(Turnover '~degree*'C'^'-1'*')')), y = '', tag = 'D') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_cartesian(xlim =c(0, 1)) +
  scale_y_continuous(name = '', breaks = c(1, 2, 3), labels = c('Terrestrial', 'Marine', 'Freshwater'))

grid.arrange(p1, p2, p3, p4, ncol = 3, layout_matrix = rbind(c(1,1,1), c(2,3,4)),
             heights=c(unit(0.66, "npc"), unit(0.34, "npc")))

Full models

Try static covariates plus interactions of abs temperature trend with each covariate:

  • realm
  • environmental temperature
  • average metabolic temperature
  • seasonality
  • microclimates
  • NPP
  • speed
  • mass
  • lifespan
  • consumer vs. producer
  • thermal bias

Except for thermal bias: interact with temperature trend (not abs)

Full model for Jaccard total

i <- trends[, complete.cases(Jtutrend, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend.sc, temptrend_abs.sc, mass.sc, speed.sc, lifespan.sc, 
                             consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, human.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

if(file.exists('temp/modTfull1.rds')){
  modTfull1 <- readRDS('temp/modTfull1.rds')
} else {
  modTfull1 <- lme(Jtutrend ~ temptrend_abs.sc*REALM + 
                     temptrend_abs.sc*tempave.sc +
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*lifespan.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*endothermfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend.sc*thermal_bias.sc +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*human.sc*REALM,
                   random = randef, weights = varef, data = trends[i,], method = 'REML')
  saveRDS(modTfull1, file = 'temp/modTfull1.rds')
}

summary(modTfull1)
Linear mixed-effects model fit by REML
 Data: trends[i, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05028541 (Intr)
temptrend_abs.sc 0.01934781 0.555 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.001189033 0.3037859

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.246996 
Fixed effects: Jtutrend ~ temptrend_abs.sc * REALM + temptrend_abs.sc * tempave.sc +      temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      lifespan.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      endothermfrac.sc + temptrend_abs.sc * nspp.sc + temptrend.sc *      thermal_bias.sc + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      human.sc * REALM 
 Correlation: 
                                           (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc spd.sc
temptrend_abs.sc                            0.368                                                                 
REALMMarine                                -0.918 -0.337                                                          
REALMTerrestrial                           -0.882 -0.333  0.807                                                   
tempave.sc                                  0.000 -0.007 -0.013  -0.003                                           
tempave_metab.sc                            0.053  0.015 -0.042  -0.045  -0.278                                   
seas.sc                                    -0.037 -0.004  0.053  -0.003   0.271 -0.083                            
microclim.sc                               -0.008  0.002  0.013  -0.010   0.049  0.067  0.170                     
mass.sc                                     0.019  0.000 -0.004   0.001  -0.002 -0.550 -0.046 -0.015              
speed.sc                                    0.021  0.007 -0.034  -0.032  -0.003  0.170 -0.075 -0.032 -0.135       
lifespan.sc                                 0.037  0.021 -0.024  -0.043  -0.037  0.752  0.094  0.047 -0.806  0.265
consumerfrac.sc                            -0.067 -0.057  0.074   0.342  -0.014 -0.090  0.004  0.007  0.063 -0.163
endothermfrac.sc                            0.169  0.077 -0.087  -0.349   0.080 -0.167  0.048 -0.002  0.014  0.083
nspp.sc                                    -0.023  0.000 -0.002  -0.014  -0.047 -0.021 -0.033 -0.056 -0.156 -0.050
temptrend.sc                               -0.005 -0.009  0.006   0.008  -0.060 -0.018 -0.044 -0.013  0.015 -0.011
thermal_bias.sc                             0.030 -0.006 -0.044  -0.008   0.759 -0.044 -0.152 -0.131  0.039  0.019
npp.sc                                      0.004  0.000 -0.006  -0.001  -0.320  0.241 -0.256 -0.220 -0.011 -0.021
human.sc                                   -0.166 -0.023  0.157   0.146   0.017 -0.005  0.008  0.017  0.006  0.004
temptrend_abs.sc:REALMMarine               -0.349 -0.953  0.369   0.315   0.007 -0.009  0.014  0.001  0.006 -0.011
temptrend_abs.sc:REALMTerrestrial          -0.327 -0.874  0.301   0.367  -0.007 -0.016 -0.020 -0.012  0.012 -0.010
temptrend_abs.sc:tempave.sc                 0.001 -0.004 -0.002  -0.003   0.099 -0.059  0.036 -0.028 -0.035 -0.031
temptrend_abs.sc:tempave_metab.sc           0.009  0.032 -0.004  -0.005   0.033  0.330  0.018  0.085 -0.207  0.074
temptrend_abs.sc:seas.sc                    0.012 -0.029 -0.008  -0.023   0.153  0.024  0.227  0.027 -0.039 -0.029
temptrend_abs.sc:microclim.sc              -0.004 -0.032  0.001  -0.002   0.012  0.099  0.059  0.312 -0.033  0.008
temptrend_abs.sc:mass.sc                   -0.001 -0.002  0.007   0.009  -0.016 -0.272 -0.038 -0.024  0.459 -0.043
temptrend_abs.sc:speed.sc                  -0.001 -0.004  0.000  -0.005  -0.009  0.028 -0.028  0.002 -0.014  0.180
temptrend_abs.sc:lifespan.sc                0.009  0.040 -0.003  -0.010   0.000  0.378  0.049  0.026 -0.385  0.095
temptrend_abs.sc:consumerfrac.sc           -0.050 -0.058  0.050   0.124  -0.008 -0.067 -0.005 -0.003  0.037 -0.055
                                           lfspn. cnsmr. endth. nspp.s tmptr. thrm_. npp.sc hmn.sc tm_.:REALMM
temptrend_abs.sc                                                                                              
REALMMarine                                                                                                   
REALMTerrestrial                                                                                              
tempave.sc                                                                                                    
tempave_metab.sc                                                                                              
seas.sc                                                                                                       
microclim.sc                                                                                                  
mass.sc                                                                                                       
speed.sc                                                                                                      
lifespan.sc                                                                                                   
consumerfrac.sc                            -0.123                                                             
endothermfrac.sc                           -0.014 -0.440                                                      
nspp.sc                                     0.098  0.014  0.057                                               
temptrend.sc                               -0.012  0.011  0.002  0.015                                        
thermal_bias.sc                            -0.067  0.001 -0.006 -0.106 -0.001                                 
npp.sc                                      0.059 -0.047 -0.090 -0.162 -0.012 -0.137                          
human.sc                                    0.007  0.013 -0.002 -0.015  0.008  0.016 -0.029                   
temptrend_abs.sc:REALMMarine               -0.015  0.060 -0.051 -0.007  0.006  0.005 -0.008  0.023            
temptrend_abs.sc:REALMTerrestrial          -0.022  0.139 -0.130 -0.015  0.009  0.001  0.013  0.020  0.829     
temptrend_abs.sc:tempave.sc                 0.005 -0.005  0.024 -0.002 -0.071  0.016 -0.031 -0.004  0.003     
temptrend_abs.sc:tempave_metab.sc           0.300 -0.034 -0.060 -0.025  0.001  0.090  0.027  0.003 -0.023     
temptrend_abs.sc:seas.sc                    0.042  0.016  0.002 -0.006 -0.029  0.098 -0.178 -0.003  0.054     
temptrend_abs.sc:microclim.sc               0.022  0.002 -0.032  0.005  0.003 -0.029 -0.141  0.002  0.042     
temptrend_abs.sc:mass.sc                   -0.385  0.037  0.006 -0.056  0.019  0.014  0.007  0.009  0.015     
temptrend_abs.sc:speed.sc                   0.051 -0.041  0.027 -0.024 -0.006  0.010  0.012  0.012 -0.024     
temptrend_abs.sc:lifespan.sc                0.475 -0.057 -0.035  0.040 -0.015 -0.014  0.016 -0.001 -0.033     
temptrend_abs.sc:consumerfrac.sc           -0.077  0.278 -0.127  0.008  0.009 -0.009 -0.018 -0.011  0.071     
                                           tm_.:REALMT tmptrnd_bs.sc:t. t_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                                  
REALMMarine                                                                                                       
REALMTerrestrial                                                                                                  
tempave.sc                                                                                                        
tempave_metab.sc                                                                                                  
seas.sc                                                                                                           
microclim.sc                                                                                                      
mass.sc                                                                                                           
speed.sc                                                                                                          
lifespan.sc                                                                                                       
consumerfrac.sc                                                                                                   
endothermfrac.sc                                                                                                  
nspp.sc                                                                                                           
temptrend.sc                                                                                                      
thermal_bias.sc                                                                                                   
npp.sc                                                                                                            
human.sc                                                                                                          
temptrend_abs.sc:REALMMarine                                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                                 
temptrend_abs.sc:tempave.sc                 0.003                                                                 
temptrend_abs.sc:tempave_metab.sc          -0.030      -0.639                                                     
temptrend_abs.sc:seas.sc                   -0.050       0.206            0.017                                    
temptrend_abs.sc:microclim.sc              -0.002      -0.039            0.010  0.048                             
temptrend_abs.sc:mass.sc                    0.027      -0.059           -0.424 -0.029             0.014           
temptrend_abs.sc:speed.sc                  -0.008      -0.042            0.093 -0.037            -0.038           
temptrend_abs.sc:lifespan.sc               -0.040      -0.003            0.633  0.055             0.013           
temptrend_abs.sc:consumerfrac.sc            0.267       0.023           -0.114 -0.029             0.008           
                                           tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:l. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tempave.sc                                                                                                      
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
lifespan.sc                                                                                                     
consumerfrac.sc                                                                                                 
endothermfrac.sc                                                                                                
nspp.sc                                                                                                         
temptrend.sc                                                                                                    
thermal_bias.sc                                                                                                 
npp.sc                                                                                                          
human.sc                                                                                                        
temptrend_abs.sc:REALMMarine                                                                                    
temptrend_abs.sc:REALMTerrestrial                                                                               
temptrend_abs.sc:tempave.sc                                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                               
temptrend_abs.sc:seas.sc                                                                                        
temptrend_abs.sc:microclim.sc                                                                                   
temptrend_abs.sc:mass.sc                                                                                        
temptrend_abs.sc:speed.sc                  -0.059                                                               
temptrend_abs.sc:lifespan.sc               -0.805             0.150                                             
temptrend_abs.sc:consumerfrac.sc            0.062            -0.234            -0.147                           
                                           tmptrnd_bs.sc:nd. tmptrnd_bs.sc:ns. tm.:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                       
REALMMarine                                                                                            
REALMTerrestrial                                                                                       
tempave.sc                                                                                             
tempave_metab.sc                                                                                       
seas.sc                                                                                                
microclim.sc                                                                                           
mass.sc                                                                                                
speed.sc                                                                                               
lifespan.sc                                                                                            
consumerfrac.sc                                                                                        
endothermfrac.sc                                                                                       
nspp.sc                                                                                                
temptrend.sc                                                                                           
thermal_bias.sc                                                                                        
npp.sc                                                                                                 
human.sc                                                                                               
temptrend_abs.sc:REALMMarine                                                                           
temptrend_abs.sc:REALMTerrestrial                                                                      
temptrend_abs.sc:tempave.sc                                                                            
temptrend_abs.sc:tempave_metab.sc                                                                      
temptrend_abs.sc:seas.sc                                                                               
temptrend_abs.sc:microclim.sc                                                                          
temptrend_abs.sc:mass.sc                                                                               
temptrend_abs.sc:speed.sc                                                                              
temptrend_abs.sc:lifespan.sc                                                                           
temptrend_abs.sc:consumerfrac.sc                                                                       
                                           tmptrnd_bs.sc:h. REALMM: REALMT: t_.:REALMM:
temptrend_abs.sc                                                                       
REALMMarine                                                                            
REALMTerrestrial                                                                       
tempave.sc                                                                             
tempave_metab.sc                                                                       
seas.sc                                                                                
microclim.sc                                                                           
mass.sc                                                                                
speed.sc                                                                               
lifespan.sc                                                                            
consumerfrac.sc                                                                        
endothermfrac.sc                                                                       
nspp.sc                                                                                
temptrend.sc                                                                           
thermal_bias.sc                                                                        
npp.sc                                                                                 
human.sc                                                                               
temptrend_abs.sc:REALMMarine                                                           
temptrend_abs.sc:REALMTerrestrial                                                      
temptrend_abs.sc:tempave.sc                                                            
temptrend_abs.sc:tempave_metab.sc                                                      
temptrend_abs.sc:seas.sc                                                               
temptrend_abs.sc:microclim.sc                                                          
temptrend_abs.sc:mass.sc                                                               
temptrend_abs.sc:speed.sc                                                              
temptrend_abs.sc:lifespan.sc                                                           
temptrend_abs.sc:consumerfrac.sc                                                       
 [ reached getOption("max.print") -- omitted 9 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-7.58461466 -0.34521721  0.05131203  0.55413461  6.93144917 

Number of Observations: 43585
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   250                  43585 

Try simplifying the model

i <- trends[, complete.cases(Jtutrend, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend.sc, temptrend_abs.sc, mass.sc, speed.sc, lifespan.sc, 
                             consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, human.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

if(file.exists('temp/modTfull1simpreml.rds')){
  modTfull1simpreml <- readRDS('temp/modTfull1simpreml.rds')
} else {
  require(MASS) # for stepAIC
  modTfull1ml <- update(modTfull1, method = 'ML')
  modTfull1simp <- stepAIC(modTfull1ml, direction = 'backward')
  modTfull1simpreml <- update(modTfull1simp, method = 'REML')
  saveRDS(modTfull1simpreml, file = 'temp/modTfull1simpreml.rds')
}
summary(modTfull1simpreml)
Linear mixed-effects model fit by REML
 Data: trends[i, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.05008648 (Intr)
temptrend_abs.sc 0.01884335 0.56  

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.001194902 0.3037795

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.246946 
Fixed effects: Jtutrend ~ temptrend_abs.sc + REALM + tempave.sc + tempave_metab.sc +      seas.sc + microclim.sc + mass.sc + speed.sc + lifespan.sc +      endothermfrac.sc + nspp.sc + temptrend.sc + thermal_bias.sc +      npp.sc + human.sc + temptrend_abs.sc:REALM + temptrend_abs.sc:tempave_metab.sc +      temptrend_abs.sc:seas.sc + temptrend_abs.sc:microclim.sc +      temptrend_abs.sc:mass.sc + temptrend_abs.sc:lifespan.sc +      temptrend_abs.sc:nspp.sc + temptrend.sc:thermal_bias.sc +      temptrend_abs.sc:npp.sc + temptrend_abs.sc:human.sc + REALM:human.sc +      temptrend_abs.sc:REALM:human.sc 
 Correlation: 
                                           (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc spd.sc
temptrend_abs.sc                            0.360                                                                 
REALMMarine                                -0.918 -0.333                                                          
REALMTerrestrial                           -0.916 -0.325  0.835                                                   
tempave.sc                                  0.004  0.005 -0.014  -0.005                                           
tempave_metab.sc                            0.052  0.023 -0.037  -0.023  -0.289                                   
seas.sc                                    -0.036  0.000  0.053  -0.006   0.268 -0.084                            
microclim.sc                               -0.005  0.007  0.012  -0.016   0.049  0.063  0.171                     
mass.sc                                     0.022  0.000 -0.009  -0.020   0.006 -0.551 -0.045 -0.015              
speed.sc                                    0.013  0.005 -0.025   0.022  -0.003  0.154 -0.072 -0.034 -0.128       
lifespan.sc                                 0.032  0.024 -0.015  -0.006  -0.047  0.750  0.095  0.046 -0.807  0.246
endothermfrac.sc                            0.145  0.007 -0.055  -0.222   0.123 -0.212  0.070  0.017  0.037  0.023
nspp.sc                                    -0.026 -0.009 -0.002  -0.014  -0.042 -0.013 -0.032 -0.053 -0.161 -0.043
temptrend.sc                               -0.006 -0.013  0.006   0.007  -0.050 -0.018 -0.041 -0.014  0.010 -0.009
thermal_bias.sc                             0.035  0.007 -0.047  -0.016   0.760 -0.053 -0.156 -0.135  0.043  0.016
npp.sc                                      0.001 -0.002 -0.003   0.015  -0.322  0.237 -0.255 -0.221 -0.009 -0.032
human.sc                                   -0.167 -0.020  0.157   0.152   0.018 -0.005  0.009  0.017  0.005  0.004
temptrend_abs.sc:REALMMarine               -0.341 -0.955  0.364   0.308   0.000 -0.009  0.011 -0.002  0.004 -0.001
temptrend_abs.sc:REALMTerrestrial          -0.319 -0.896  0.299   0.337  -0.029 -0.021 -0.027 -0.024  0.008 -0.001
temptrend_abs.sc:tempave_metab.sc           0.025  0.081 -0.008  -0.016   0.103  0.365  0.049  0.080 -0.302  0.047
temptrend_abs.sc:seas.sc                    0.019 -0.014 -0.010  -0.039   0.126  0.026  0.222  0.029 -0.029 -0.017
temptrend_abs.sc:microclim.sc              -0.005 -0.036  0.001  -0.001   0.017  0.100  0.060  0.312 -0.036  0.015
temptrend_abs.sc:mass.sc                    0.002 -0.001  0.003  -0.004  -0.008 -0.273 -0.037 -0.025  0.457 -0.030
temptrend_abs.sc:lifespan.sc                0.009  0.050  0.001   0.003  -0.011  0.367  0.050  0.022 -0.385  0.064
temptrend_abs.sc:nspp.sc                   -0.008  0.021 -0.002   0.001  -0.028  0.014  0.001  0.013 -0.070  0.029
temptrend.sc:thermal_bias.sc                0.009  0.019 -0.008  -0.007   0.067  0.033  0.000 -0.032 -0.002  0.008
temptrend_abs.sc:npp.sc                     0.002 -0.054 -0.007   0.012  -0.115  0.095 -0.161 -0.163  0.013  0.000
temptrend_abs.sc:human.sc                  -0.070  0.160  0.066   0.063  -0.004 -0.009  0.005  0.006  0.009 -0.007
REALMMarine:human.sc                        0.167  0.021 -0.158  -0.152  -0.020  0.004 -0.017 -0.024 -0.005 -0.003
REALMTerrestrial:human.sc                   0.166  0.020 -0.157  -0.152  -0.032  0.007 -0.022 -0.006 -0.002 -0.001
temptrend_abs.sc:REALMMarine:human.sc       0.070 -0.158 -0.066  -0.063   0.001  0.009 -0.009 -0.009 -0.009  0.007
temptrend_abs.sc:REALMTerrestrial:human.sc  0.069 -0.160 -0.066  -0.063   0.012  0.007 -0.003 -0.005 -0.008  0.006
                                           lfspn. endth. nspp.s tmptr. thrm_. npp.sc hmn.sc tm_.:REALMM tm_.:REALMT
temptrend_abs.sc                                                                                                   
REALMMarine                                                                                                        
REALMTerrestrial                                                                                                   
tempave.sc                                                                                                         
tempave_metab.sc                                                                                                   
seas.sc                                                                                                            
microclim.sc                                                                                                       
mass.sc                                                                                                            
speed.sc                                                                                                           
lifespan.sc                                                                                                        
endothermfrac.sc                           -0.054                                                                  
nspp.sc                                     0.107  0.051                                                           
temptrend.sc                               -0.007 -0.002  0.013                                                    
thermal_bias.sc                            -0.075  0.028 -0.100  0.003                                             
npp.sc                                      0.053 -0.129 -0.161 -0.013 -0.139                                      
human.sc                                    0.008  0.006 -0.015  0.008  0.015 -0.029                               
temptrend_abs.sc:REALMMarine               -0.011  0.005 -0.003  0.008 -0.003 -0.006  0.020                        
temptrend_abs.sc:REALMTerrestrial          -0.017  0.019  0.000  0.015 -0.023  0.020  0.019  0.855                 
temptrend_abs.sc:tempave_metab.sc           0.385  0.027 -0.011 -0.049  0.108  0.003 -0.001 -0.048      -0.098     
temptrend_abs.sc:seas.sc                    0.035  0.053  0.001 -0.011  0.087 -0.178 -0.003  0.046      -0.082     
temptrend_abs.sc:microclim.sc               0.025 -0.043  0.003  0.000 -0.026 -0.142  0.002  0.044       0.002     
temptrend_abs.sc:mass.sc                   -0.381  0.023 -0.060  0.013  0.017  0.008  0.010  0.011       0.017     
temptrend_abs.sc:lifespan.sc                0.466 -0.031  0.053 -0.010 -0.027  0.011 -0.004 -0.032      -0.038     
temptrend_abs.sc:nspp.sc                    0.076 -0.029  0.303  0.015 -0.051 -0.017 -0.011 -0.053      -0.039     
temptrend.sc:thermal_bias.sc                0.003  0.008 -0.010 -0.402 -0.015 -0.003 -0.006 -0.017      -0.020     
temptrend_abs.sc:npp.sc                     0.010 -0.062 -0.034 -0.016 -0.044  0.366 -0.012  0.040       0.053     
temptrend_abs.sc:human.sc                  -0.008  0.000 -0.003  0.007 -0.008 -0.012  0.409 -0.151      -0.139     
REALMMarine:human.sc                       -0.009 -0.006  0.013 -0.008 -0.014  0.018 -0.998 -0.021      -0.019     
REALMTerrestrial:human.sc                  -0.013 -0.011  0.018 -0.007 -0.020  0.027 -0.998 -0.020      -0.019     
temptrend_abs.sc:REALMMarine:human.sc       0.008  0.000  0.000 -0.006  0.006  0.008 -0.408  0.150       0.139     
temptrend_abs.sc:REALMTerrestrial:human.sc  0.008  0.002  0.004 -0.007  0.011  0.013 -0.406  0.151       0.138     
                                           t_.:_. tmptrnd_bs.sc:s. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                                      
REALMMarine                                                                                           
REALMTerrestrial                                                                                      
tempave.sc                                                                                            
tempave_metab.sc                                                                                      
seas.sc                                                                                               
microclim.sc                                                                                          
mass.sc                                                                                               
speed.sc                                                                                              
lifespan.sc                                                                                           
endothermfrac.sc                                                                                      
nspp.sc                                                                                               
temptrend.sc                                                                                          
thermal_bias.sc                                                                                       
npp.sc                                                                                                
human.sc                                                                                              
temptrend_abs.sc:REALMMarine                                                                          
temptrend_abs.sc:REALMTerrestrial                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                     
temptrend_abs.sc:seas.sc                    0.170                                                     
temptrend_abs.sc:microclim.sc              -0.012  0.058                                              
temptrend_abs.sc:mass.sc                   -0.626 -0.016            0.009                             
temptrend_abs.sc:lifespan.sc                0.829  0.045            0.021            -0.813           
temptrend_abs.sc:nspp.sc                    0.080 -0.056           -0.174            -0.224           
temptrend.sc:thermal_bias.sc                0.072 -0.030           -0.036            -0.004           
temptrend_abs.sc:npp.sc                     0.046 -0.169           -0.213            -0.032           
temptrend_abs.sc:human.sc                  -0.030 -0.018            0.038             0.049           
REALMMarine:human.sc                        0.001 -0.001           -0.005            -0.009           
REALMTerrestrial:human.sc                  -0.001 -0.002            0.001            -0.008           
temptrend_abs.sc:REALMMarine:human.sc       0.030  0.009           -0.037            -0.048           
temptrend_abs.sc:REALMTerrestrial:human.sc  0.023  0.014           -0.027            -0.045           
                                           tmptrnd_bs.sc:l. tmptrnd_bs.sc:ns. tm.:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                      
REALMMarine                                                                                           
REALMTerrestrial                                                                                      
tempave.sc                                                                                            
tempave_metab.sc                                                                                      
seas.sc                                                                                               
microclim.sc                                                                                          
mass.sc                                                                                               
speed.sc                                                                                              
lifespan.sc                                                                                           
endothermfrac.sc                                                                                      
nspp.sc                                                                                               
temptrend.sc                                                                                          
thermal_bias.sc                                                                                       
npp.sc                                                                                                
human.sc                                                                                              
temptrend_abs.sc:REALMMarine                                                                          
temptrend_abs.sc:REALMTerrestrial                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                     
temptrend_abs.sc:seas.sc                                                                              
temptrend_abs.sc:microclim.sc                                                                         
temptrend_abs.sc:mass.sc                                                                              
temptrend_abs.sc:lifespan.sc                                                                          
temptrend_abs.sc:nspp.sc                    0.231                                                     
temptrend.sc:thermal_bias.sc               -0.004            0.002                                    
temptrend_abs.sc:npp.sc                     0.042           -0.188             0.001                  
temptrend_abs.sc:human.sc                  -0.027           -0.032            -0.004 -0.034           
REALMMarine:human.sc                        0.003            0.010             0.005  0.008           
REALMTerrestrial:human.sc                   0.002            0.013             0.004  0.012           
temptrend_abs.sc:REALMMarine:human.sc       0.027            0.028             0.005  0.024           
temptrend_abs.sc:REALMTerrestrial:human.sc  0.021            0.033             0.006  0.030           
                                           tmptrnd_bs.sc:h. REALMM: REALMT: t_.:REALMM:
temptrend_abs.sc                                                                       
REALMMarine                                                                            
REALMTerrestrial                                                                       
tempave.sc                                                                             
tempave_metab.sc                                                                       
seas.sc                                                                                
microclim.sc                                                                           
mass.sc                                                                                
speed.sc                                                                               
lifespan.sc                                                                            
endothermfrac.sc                                                                       
nspp.sc                                                                                
temptrend.sc                                                                           
thermal_bias.sc                                                                        
npp.sc                                                                                 
human.sc                                                                               
temptrend_abs.sc:REALMMarine                                                           
temptrend_abs.sc:REALMTerrestrial                                                      
temptrend_abs.sc:tempave_metab.sc                                                      
temptrend_abs.sc:seas.sc                                                               
temptrend_abs.sc:microclim.sc                                                          
temptrend_abs.sc:mass.sc                                                               
temptrend_abs.sc:lifespan.sc                                                           
temptrend_abs.sc:nspp.sc                                                               
temptrend.sc:thermal_bias.sc                                                           
temptrend_abs.sc:npp.sc                                                                
temptrend_abs.sc:human.sc                                                              
REALMMarine:human.sc                       -0.408                                      
REALMTerrestrial:human.sc                  -0.408            0.997                     
temptrend_abs.sc:REALMMarine:human.sc      -0.998            0.409   0.407             
temptrend_abs.sc:REALMTerrestrial:human.sc -0.993            0.405   0.404   0.991     

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-7.59387150 -0.34529883  0.05138559  0.55509022  6.91268058 

Number of Observations: 43585
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   250                  43585 

Plot the coefficients from the simplified model


coefs <- summary(modTfull1simpreml)$tTable
par(las = 1, mai = c(0.5, 3, 0.1, 0.1))
rows1 <- which(!grepl('Intercept', rownames(coefs)))
plot(0,0, col = 'white', xlim=c(-0.02, 0.08), ylim = c(1,length(rows1)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(rows1):1, labels = rownames(coefs)[rows1], cex.axis = 0.7)
abline(v = 0, col = 'grey')
for(i in 1:length(rows1)){
  x = coefs[rows1[i], 1]
  se = coefs[rows1[i], 2]
  points(x, length(rows1) + 1 - i, pch = 16)
  lines(x = c(x-se, x+se), y = c(length(rows1) + 1 - i, length(rows1) + 1 - i))
}

Plot residuals against each predictor

resids <- resid(modTfull1simpreml)
preds <- getData(modTfull1simpreml)
col = '#00000033'
cex = 0.5
par(mfrow = c(4,4))
boxplot(resids ~ preds$REALM, cex = cex, col = col)
plot(preds$temptrend_abs.sc, resids, cex = cex, col = col)
plot(preds$temptrend.sc, resids, cex = cex, col = col)
plot(preds$tempave.sc, resids, cex = cex, col = col)
plot(preds$tempave_metab.sc, resids, cex = cex, col = col)
plot(preds$seas.sc, resids, cex = cex, col = col)
plot(preds$microclim.sc, resids, cex = cex, col = col)
plot(preds$mass.sc, resids, cex = cex, col = col)
plot(preds$speed.sc, resids, cex = cex, col = col)
plot(preds$lifespan.sc, resids, cex = cex, col = col)
plot(preds$consumerfrac.sc, resids, cex = cex, col = col)
plot(preds$endothermfrac.sc, resids, cex = cex, col = col)
plot(preds$nspp.sc, resids, cex = cex, col = col)
plot(preds$thermal_bias.sc, resids, cex = cex, col = col)
plot(preds$npp.sc, resids, cex = cex, col = col)
plot(preds$human.sc, resids, cex = cex, col = col)

Sensitivity analysis: total turnover and Horn-Morisita models

Fit full models for total and HM

i2 <- trends[, complete.cases(Jbetatrend, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend.sc, temptrend_abs.sc, mass.sc, speed.sc, lifespan.sc, 
                             consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, human.sc)]
i3 <- trends[, complete.cases(Horntrend, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend.sc, temptrend_abs.sc, mass.sc, speed.sc, lifespan.sc, 
                             consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, human.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

# full models
if(file.exists('temp/modTfullJbeta.rds')){
  modTfullJbeta <- readRDS('temp/modTfullJbeta.rds')
} else {
  modTfullJbeta <- lme(Jbetatrend ~ temptrend_abs.sc*REALM + 
                     temptrend_abs.sc*tempave.sc +
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*lifespan.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*endothermfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend.sc*thermal_bias.sc +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*human.sc*REALM,
                   random = randef, weights = varef, data = trends[i2,], method = 'REML')
  saveRDS(modTfullJbeta, file = 'temp/modTfullJbeta.rds')
}

if(file.exists('temp/modTfullHorn.rds')){
  modTfullHorn <- readRDS('temp/modTfullHorn.rds')
} else {
  modTfullHorn <- lme(Horntrend ~ temptrend_abs.sc*REALM + 
                     temptrend_abs.sc*tempave.sc +
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*lifespan.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*endothermfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend.sc*thermal_bias.sc +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*human.sc*REALM,
                   random = randef, weights = varef, data = trends[i3,], method = 'REML')
  saveRDS(modTfullHorn, file = 'temp/modTfullHorn.rds')
}

summary(modTfullJbeta)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.06574154 (Intr)
temptrend_abs.sc 0.02529340 0.519 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.002266703 0.3555714

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.375398 
Fixed effects: Jbetatrend ~ temptrend_abs.sc * REALM + temptrend_abs.sc * tempave.sc +      temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      lifespan.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      endothermfrac.sc + temptrend_abs.sc * nspp.sc + temptrend.sc *      thermal_bias.sc + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      human.sc * REALM 
 Correlation: 
                                           (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc spd.sc
temptrend_abs.sc                            0.344                                                                 
REALMMarine                                -0.918 -0.315                                                          
REALMTerrestrial                           -0.886 -0.314  0.812                                                   
tempave.sc                                 -0.002 -0.006 -0.009  -0.006                                           
tempave_metab.sc                            0.042  0.013 -0.032  -0.036  -0.264                                   
seas.sc                                    -0.026 -0.002  0.038  -0.002   0.282 -0.083                            
microclim.sc                               -0.004  0.002  0.010  -0.007   0.062  0.066  0.188                     
mass.sc                                     0.018  0.002 -0.005  -0.003   0.000 -0.550 -0.041 -0.013              
speed.sc                                    0.016  0.006 -0.025  -0.022  -0.005  0.180 -0.080 -0.037 -0.138       
lifespan.sc                                 0.027  0.016 -0.017  -0.033  -0.036  0.757  0.095  0.049 -0.801  0.280
consumerfrac.sc                            -0.050 -0.051  0.062   0.323  -0.034 -0.067  0.003  0.013  0.053 -0.123
endothermfrac.sc                            0.157  0.075 -0.079  -0.320   0.057 -0.125  0.044  0.004  0.023  0.061
nspp.sc                                    -0.020  0.001  0.000  -0.009  -0.048 -0.034 -0.026 -0.059 -0.150 -0.048
temptrend.sc                               -0.004 -0.008  0.005   0.007  -0.065 -0.019 -0.048 -0.017  0.015 -0.011
thermal_bias.sc                             0.022 -0.006 -0.033  -0.008   0.757 -0.033 -0.152 -0.127  0.038  0.018
npp.sc                                      0.003  0.001 -0.007  -0.007  -0.322  0.246 -0.265 -0.223 -0.013 -0.023
human.sc                                   -0.131 -0.012  0.123   0.116   0.020 -0.009  0.013  0.017  0.003  0.001
temptrend_abs.sc:REALMMarine               -0.327 -0.953  0.347   0.299   0.006 -0.008  0.010  0.000  0.004 -0.010
temptrend_abs.sc:REALMTerrestrial          -0.307 -0.878  0.282   0.346  -0.004 -0.014 -0.015 -0.009  0.007 -0.007
temptrend_abs.sc:tempave.sc                -0.001 -0.006 -0.001  -0.003   0.108 -0.063  0.050 -0.026 -0.033 -0.030
temptrend_abs.sc:tempave_metab.sc           0.008  0.027 -0.005  -0.004   0.031  0.353  0.014  0.086 -0.218  0.088
temptrend_abs.sc:seas.sc                    0.010 -0.024 -0.005  -0.014   0.158  0.026  0.232  0.025 -0.036 -0.029
temptrend_abs.sc:microclim.sc              -0.002 -0.023  0.000  -0.001   0.010  0.101  0.054  0.277 -0.029  0.009
temptrend_abs.sc:mass.sc                    0.001  0.004  0.004   0.006  -0.013 -0.290 -0.034 -0.020  0.496 -0.054
temptrend_abs.sc:speed.sc                   0.000 -0.002 -0.001  -0.005  -0.006  0.038 -0.029  0.004 -0.023  0.222
temptrend_abs.sc:lifespan.sc                0.007  0.031 -0.004  -0.008  -0.002  0.409  0.050  0.025 -0.409  0.122
temptrend_abs.sc:consumerfrac.sc           -0.049 -0.055  0.047   0.121  -0.007 -0.057 -0.003 -0.003  0.030 -0.053
                                           lfspn. cnsmr. endth. nspp.s tmptr. thrm_. npp.sc hmn.sc tm_.:REALMM
temptrend_abs.sc                                                                                              
REALMMarine                                                                                                   
REALMTerrestrial                                                                                              
tempave.sc                                                                                                    
tempave_metab.sc                                                                                              
seas.sc                                                                                                       
microclim.sc                                                                                                  
mass.sc                                                                                                       
speed.sc                                                                                                      
lifespan.sc                                                                                                   
consumerfrac.sc                            -0.103                                                             
endothermfrac.sc                           -0.012 -0.427                                                      
nspp.sc                                     0.085  0.006  0.043                                               
temptrend.sc                               -0.012  0.012  0.003  0.020                                        
thermal_bias.sc                            -0.065 -0.006 -0.003 -0.112 -0.001                                 
npp.sc                                      0.063 -0.059 -0.080 -0.165 -0.015 -0.135                          
human.sc                                    0.005  0.010  0.001 -0.009  0.009  0.015 -0.034                   
temptrend_abs.sc:REALMMarine               -0.012  0.054 -0.049 -0.007  0.006  0.005 -0.007  0.012            
temptrend_abs.sc:REALMTerrestrial          -0.017  0.134 -0.132 -0.013  0.008  0.002  0.008  0.010  0.833     
temptrend_abs.sc:tempave.sc                 0.003 -0.011  0.017 -0.003 -0.077  0.008 -0.033 -0.003  0.005     
temptrend_abs.sc:tempave_metab.sc           0.319 -0.022 -0.053 -0.028  0.002  0.098  0.030 -0.001 -0.020     
temptrend_abs.sc:seas.sc                    0.041  0.028  0.007 -0.010 -0.033  0.101 -0.180  0.000  0.044     
temptrend_abs.sc:microclim.sc               0.018  0.003 -0.028 -0.001  0.001 -0.022 -0.126  0.001  0.032     
temptrend_abs.sc:mass.sc                   -0.409  0.034  0.007 -0.060  0.019  0.015  0.005  0.011  0.009     
temptrend_abs.sc:speed.sc                   0.070 -0.036  0.024 -0.025 -0.004  0.012  0.012  0.011 -0.020     
temptrend_abs.sc:lifespan.sc                0.510 -0.047 -0.038  0.038 -0.016 -0.014  0.021 -0.005 -0.025     
temptrend_abs.sc:consumerfrac.sc           -0.067  0.251 -0.134  0.005  0.008 -0.005 -0.019 -0.007  0.072     
                                           tm_.:REALMT tmptrnd_bs.sc:t. t_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                                  
REALMMarine                                                                                                       
REALMTerrestrial                                                                                                  
tempave.sc                                                                                                        
tempave_metab.sc                                                                                                  
seas.sc                                                                                                           
microclim.sc                                                                                                      
mass.sc                                                                                                           
speed.sc                                                                                                          
lifespan.sc                                                                                                       
consumerfrac.sc                                                                                                   
endothermfrac.sc                                                                                                  
nspp.sc                                                                                                           
temptrend.sc                                                                                                      
thermal_bias.sc                                                                                                   
npp.sc                                                                                                            
human.sc                                                                                                          
temptrend_abs.sc:REALMMarine                                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                                 
temptrend_abs.sc:tempave.sc                 0.002                                                                 
temptrend_abs.sc:tempave_metab.sc          -0.024      -0.649                                                     
temptrend_abs.sc:seas.sc                   -0.035       0.245           -0.011                                    
temptrend_abs.sc:microclim.sc              -0.003      -0.024           -0.001  0.059                             
temptrend_abs.sc:mass.sc                    0.014      -0.053           -0.407 -0.027             0.015           
temptrend_abs.sc:speed.sc                  -0.005      -0.044            0.090 -0.046            -0.047           
temptrend_abs.sc:lifespan.sc               -0.031      -0.007            0.628  0.053             0.016           
temptrend_abs.sc:consumerfrac.sc            0.258       0.013           -0.090 -0.017             0.010           
                                           tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:l. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tempave.sc                                                                                                      
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
lifespan.sc                                                                                                     
consumerfrac.sc                                                                                                 
endothermfrac.sc                                                                                                
nspp.sc                                                                                                         
temptrend.sc                                                                                                    
thermal_bias.sc                                                                                                 
npp.sc                                                                                                          
human.sc                                                                                                        
temptrend_abs.sc:REALMMarine                                                                                    
temptrend_abs.sc:REALMTerrestrial                                                                               
temptrend_abs.sc:tempave.sc                                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                               
temptrend_abs.sc:seas.sc                                                                                        
temptrend_abs.sc:microclim.sc                                                                                   
temptrend_abs.sc:mass.sc                                                                                        
temptrend_abs.sc:speed.sc                  -0.055                                                               
temptrend_abs.sc:lifespan.sc               -0.790             0.150                                             
temptrend_abs.sc:consumerfrac.sc            0.041            -0.188            -0.120                           
                                           tmptrnd_bs.sc:nd. tmptrnd_bs.sc:ns. tm.:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                       
REALMMarine                                                                                            
REALMTerrestrial                                                                                       
tempave.sc                                                                                             
tempave_metab.sc                                                                                       
seas.sc                                                                                                
microclim.sc                                                                                           
mass.sc                                                                                                
speed.sc                                                                                               
lifespan.sc                                                                                            
consumerfrac.sc                                                                                        
endothermfrac.sc                                                                                       
nspp.sc                                                                                                
temptrend.sc                                                                                           
thermal_bias.sc                                                                                        
npp.sc                                                                                                 
human.sc                                                                                               
temptrend_abs.sc:REALMMarine                                                                           
temptrend_abs.sc:REALMTerrestrial                                                                      
temptrend_abs.sc:tempave.sc                                                                            
temptrend_abs.sc:tempave_metab.sc                                                                      
temptrend_abs.sc:seas.sc                                                                               
temptrend_abs.sc:microclim.sc                                                                          
temptrend_abs.sc:mass.sc                                                                               
temptrend_abs.sc:speed.sc                                                                              
temptrend_abs.sc:lifespan.sc                                                                           
temptrend_abs.sc:consumerfrac.sc                                                                       
                                           tmptrnd_bs.sc:h. REALMM: REALMT: t_.:REALMM:
temptrend_abs.sc                                                                       
REALMMarine                                                                            
REALMTerrestrial                                                                       
tempave.sc                                                                             
tempave_metab.sc                                                                       
seas.sc                                                                                
microclim.sc                                                                           
mass.sc                                                                                
speed.sc                                                                               
lifespan.sc                                                                            
consumerfrac.sc                                                                        
endothermfrac.sc                                                                       
nspp.sc                                                                                
temptrend.sc                                                                           
thermal_bias.sc                                                                        
npp.sc                                                                                 
human.sc                                                                               
temptrend_abs.sc:REALMMarine                                                           
temptrend_abs.sc:REALMTerrestrial                                                      
temptrend_abs.sc:tempave.sc                                                            
temptrend_abs.sc:tempave_metab.sc                                                      
temptrend_abs.sc:seas.sc                                                               
temptrend_abs.sc:microclim.sc                                                          
temptrend_abs.sc:mass.sc                                                               
temptrend_abs.sc:speed.sc                                                              
temptrend_abs.sc:lifespan.sc                                                           
temptrend_abs.sc:consumerfrac.sc                                                       
 [ reached getOption("max.print") -- omitted 9 rows ]

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-6.8341663 -0.2345669  0.1396972  0.6505144  7.5323730 

Number of Observations: 43585
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   250                  43585 
summary(modTfullHorn)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.06615737 (Intr)
temptrend_abs.sc 0.02037063 0.557 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev:  0.00442701 0.3182813

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.239152 
Fixed effects: Horntrend ~ temptrend_abs.sc * REALM + temptrend_abs.sc * tempave.sc +      temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      lifespan.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      endothermfrac.sc + temptrend_abs.sc * nspp.sc + temptrend.sc *      thermal_bias.sc + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      human.sc * REALM 
 Correlation: 
                                           (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc spd.sc
temptrend_abs.sc                            0.336                                                                 
REALMMarine                                -0.905 -0.302                                                          
REALMTerrestrial                           -0.876 -0.303  0.786                                                   
tempave.sc                                 -0.002 -0.005 -0.008  -0.003                                           
tempave_metab.sc                            0.050  0.014 -0.037  -0.047  -0.337                                   
seas.sc                                    -0.039 -0.003  0.051   0.003   0.258 -0.087                            
microclim.sc                               -0.007  0.005  0.012  -0.008   0.027  0.057  0.138                     
mass.sc                                     0.017 -0.001 -0.004   0.002  -0.010 -0.525 -0.046 -0.009              
speed.sc                                    0.017  0.005 -0.030  -0.026  -0.017  0.165 -0.089 -0.041 -0.133       
lifespan.sc                                 0.034  0.021 -0.021  -0.040  -0.035  0.730  0.092  0.037 -0.802  0.256
consumerfrac.sc                            -0.051 -0.051  0.046   0.335  -0.014 -0.066 -0.003  0.010  0.052 -0.129
endothermfrac.sc                            0.163  0.075 -0.079  -0.340   0.100 -0.159  0.042  0.000  0.013  0.065
nspp.sc                                    -0.023 -0.001  0.000  -0.008  -0.044 -0.021 -0.028 -0.044 -0.163 -0.043
temptrend.sc                               -0.004 -0.007  0.005   0.008  -0.060 -0.016 -0.043 -0.013  0.016 -0.008
thermal_bias.sc                             0.029 -0.004 -0.039  -0.013   0.726 -0.049 -0.151 -0.144  0.037  0.016
npp.sc                                      0.007 -0.002 -0.008  -0.007  -0.313  0.241 -0.273 -0.259 -0.010 -0.006
human.sc                                   -0.144  0.005  0.134   0.127   0.019 -0.009  0.014  0.022  0.005  0.000
temptrend_abs.sc:REALMMarine               -0.316 -0.951  0.339   0.285   0.004 -0.007  0.010 -0.003  0.006 -0.008
temptrend_abs.sc:REALMTerrestrial          -0.297 -0.869  0.268   0.338  -0.006 -0.021 -0.018 -0.014  0.014 -0.007
temptrend_abs.sc:tempave.sc                 0.001  0.002 -0.003  -0.001   0.087 -0.056  0.006 -0.035 -0.038 -0.029
temptrend_abs.sc:tempave_metab.sc           0.007  0.026 -0.001  -0.008   0.036  0.301  0.030  0.087 -0.190  0.063
temptrend_abs.sc:seas.sc                    0.013 -0.019 -0.011  -0.020   0.117  0.031  0.181  0.007 -0.032 -0.024
temptrend_abs.sc:microclim.sc              -0.003 -0.033  0.001  -0.003  -0.007  0.098  0.043  0.248 -0.026  0.017
temptrend_abs.sc:mass.sc                   -0.001 -0.005  0.006   0.009  -0.025 -0.249 -0.036 -0.018  0.443 -0.034
temptrend_abs.sc:speed.sc                  -0.002 -0.006  0.003  -0.003  -0.008  0.019 -0.019  0.010 -0.006  0.120
temptrend_abs.sc:lifespan.sc                0.008  0.037  0.000  -0.009   0.006  0.350  0.046  0.016 -0.368  0.078
temptrend_abs.sc:consumerfrac.sc           -0.046 -0.059  0.048   0.104  -0.006 -0.057 -0.013 -0.006  0.035 -0.034
                                           lfspn. cnsmr. endth. nspp.s tmptr. thrm_. npp.sc hmn.sc tm_.:REALMM
temptrend_abs.sc                                                                                              
REALMMarine                                                                                                   
REALMTerrestrial                                                                                              
tempave.sc                                                                                                    
tempave_metab.sc                                                                                              
seas.sc                                                                                                       
microclim.sc                                                                                                  
mass.sc                                                                                                       
speed.sc                                                                                                      
lifespan.sc                                                                                                   
consumerfrac.sc                            -0.101                                                             
endothermfrac.sc                           -0.012 -0.421                                                      
nspp.sc                                     0.100  0.010  0.049                                               
temptrend.sc                               -0.012  0.010  0.001  0.018                                        
thermal_bias.sc                            -0.067  0.007  0.006 -0.107 -0.005                                 
npp.sc                                      0.056 -0.040 -0.077 -0.154 -0.016 -0.130                          
human.sc                                    0.006  0.013  0.000 -0.012  0.009  0.014 -0.038                   
temptrend_abs.sc:REALMMarine               -0.014  0.052 -0.050 -0.005  0.005  0.003 -0.005 -0.005            
temptrend_abs.sc:REALMTerrestrial          -0.023  0.123 -0.125 -0.012  0.009 -0.003  0.013 -0.004  0.820     
temptrend_abs.sc:tempave.sc                 0.004 -0.005  0.024 -0.007 -0.068  0.028 -0.014 -0.003 -0.005     
temptrend_abs.sc:tempave_metab.sc           0.281 -0.023 -0.054 -0.023  0.000  0.084  0.012  0.002 -0.015     
temptrend_abs.sc:seas.sc                    0.037  0.014 -0.007 -0.015 -0.025  0.091 -0.158 -0.003  0.044     
temptrend_abs.sc:microclim.sc               0.012 -0.002 -0.032  0.016  0.009 -0.034 -0.134  0.000  0.042     
temptrend_abs.sc:mass.sc                   -0.368  0.028  0.002 -0.051  0.021  0.007  0.009  0.008  0.016     
temptrend_abs.sc:speed.sc                   0.036 -0.026  0.018 -0.022 -0.005  0.009  0.016  0.011 -0.026     
temptrend_abs.sc:lifespan.sc                0.456 -0.043 -0.034  0.036 -0.016 -0.008  0.012 -0.001 -0.031     
temptrend_abs.sc:consumerfrac.sc           -0.069  0.225 -0.103  0.005  0.010 -0.003 -0.007 -0.009  0.064     
                                           tm_.:REALMT tmptrnd_bs.sc:t. t_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                                  
REALMMarine                                                                                                       
REALMTerrestrial                                                                                                  
tempave.sc                                                                                                        
tempave_metab.sc                                                                                                  
seas.sc                                                                                                           
microclim.sc                                                                                                      
mass.sc                                                                                                           
speed.sc                                                                                                          
lifespan.sc                                                                                                       
consumerfrac.sc                                                                                                   
endothermfrac.sc                                                                                                  
nspp.sc                                                                                                           
temptrend.sc                                                                                                      
thermal_bias.sc                                                                                                   
npp.sc                                                                                                            
human.sc                                                                                                          
temptrend_abs.sc:REALMMarine                                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                                 
temptrend_abs.sc:tempave.sc                 0.004                                                                 
temptrend_abs.sc:tempave_metab.sc          -0.032      -0.660                                                     
temptrend_abs.sc:seas.sc                   -0.075       0.135            0.055                                    
temptrend_abs.sc:microclim.sc              -0.002      -0.061            0.014  0.037                             
temptrend_abs.sc:mass.sc                    0.032      -0.064           -0.408 -0.024             0.016           
temptrend_abs.sc:speed.sc                  -0.005      -0.046            0.092 -0.039            -0.043           
temptrend_abs.sc:lifespan.sc               -0.038      -0.006            0.620  0.051             0.011           
temptrend_abs.sc:consumerfrac.sc            0.275       0.024           -0.107 -0.060             0.011           
                                           tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:l. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tempave.sc                                                                                                      
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
lifespan.sc                                                                                                     
consumerfrac.sc                                                                                                 
endothermfrac.sc                                                                                                
nspp.sc                                                                                                         
temptrend.sc                                                                                                    
thermal_bias.sc                                                                                                 
npp.sc                                                                                                          
human.sc                                                                                                        
temptrend_abs.sc:REALMMarine                                                                                    
temptrend_abs.sc:REALMTerrestrial                                                                               
temptrend_abs.sc:tempave.sc                                                                                     
temptrend_abs.sc:tempave_metab.sc                                                                               
temptrend_abs.sc:seas.sc                                                                                        
temptrend_abs.sc:microclim.sc                                                                                   
temptrend_abs.sc:mass.sc                                                                                        
temptrend_abs.sc:speed.sc                  -0.059                                                               
temptrend_abs.sc:lifespan.sc               -0.804             0.148                                             
temptrend_abs.sc:consumerfrac.sc            0.068            -0.205            -0.136                           
                                           tmptrnd_bs.sc:nd. tmptrnd_bs.sc:ns. tm.:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                       
REALMMarine                                                                                            
REALMTerrestrial                                                                                       
tempave.sc                                                                                             
tempave_metab.sc                                                                                       
seas.sc                                                                                                
microclim.sc                                                                                           
mass.sc                                                                                                
speed.sc                                                                                               
lifespan.sc                                                                                            
consumerfrac.sc                                                                                        
endothermfrac.sc                                                                                       
nspp.sc                                                                                                
temptrend.sc                                                                                           
thermal_bias.sc                                                                                        
npp.sc                                                                                                 
human.sc                                                                                               
temptrend_abs.sc:REALMMarine                                                                           
temptrend_abs.sc:REALMTerrestrial                                                                      
temptrend_abs.sc:tempave.sc                                                                            
temptrend_abs.sc:tempave_metab.sc                                                                      
temptrend_abs.sc:seas.sc                                                                               
temptrend_abs.sc:microclim.sc                                                                          
temptrend_abs.sc:mass.sc                                                                               
temptrend_abs.sc:speed.sc                                                                              
temptrend_abs.sc:lifespan.sc                                                                           
temptrend_abs.sc:consumerfrac.sc                                                                       
                                           tmptrnd_bs.sc:h. REALMM: REALMT: t_.:REALMM:
temptrend_abs.sc                                                                       
REALMMarine                                                                            
REALMTerrestrial                                                                       
tempave.sc                                                                             
tempave_metab.sc                                                                       
seas.sc                                                                                
microclim.sc                                                                           
mass.sc                                                                                
speed.sc                                                                               
lifespan.sc                                                                            
consumerfrac.sc                                                                        
endothermfrac.sc                                                                       
nspp.sc                                                                                
temptrend.sc                                                                           
thermal_bias.sc                                                                        
npp.sc                                                                                 
human.sc                                                                               
temptrend_abs.sc:REALMMarine                                                           
temptrend_abs.sc:REALMTerrestrial                                                      
temptrend_abs.sc:tempave.sc                                                            
temptrend_abs.sc:tempave_metab.sc                                                      
temptrend_abs.sc:seas.sc                                                               
temptrend_abs.sc:microclim.sc                                                          
temptrend_abs.sc:mass.sc                                                               
temptrend_abs.sc:speed.sc                                                              
temptrend_abs.sc:lifespan.sc                                                           
temptrend_abs.sc:consumerfrac.sc                                                       
 [ reached getOption("max.print") -- omitted 9 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.78006527 -0.36573591  0.04098243  0.55898457  6.73978237 

Number of Observations: 42586
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   218                  42586 

Simplify full Total and HM models

require(MASS) # for stepAIC

# simplify
if(file.exists('temp/modTfullJbetasimpreml.rds')){
  modTfullJbetasimpreml <- readRDS('temp/modTfullJbetasimpreml.rds')
} else {
  modTfullJbetaml <- update(modTfullJbeta, method = 'ML')
  modTfullJbetasimp <- stepAIC(modTfullJbetaml, direction = 'backward')
  modTfullJbetasimpreml <- update(modTfullJbetasimp, method = 'REML')
  saveRDS(modTfullJbetasimpreml, file = 'temp/modTfullJbetasimpreml.rds')
}

if(file.exists('temp/modTfullHornsimpreml.rds')){
  modTfullHornsimpreml <- readRDS('temp/modTfullHornsimpreml.rds')
} else {
  modTfullHornml <- update(modTfullHorn, method = 'ML')
  modTfullHornsimp <- stepAIC(modTfullHornml, direction = 'backward')
  modTfullHornsimpreml <- update(modTfullHornsimp, method = 'REML')
  saveRDS(modTfullHornsimpreml, file = 'temp/modTfullHornsimpreml.rds')
}

summary(modTfullJbetasimpreml)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.06586673 (Intr)
temptrend_abs.sc 0.02513701 0.524 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.002270429 0.3556052

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
   power 
-1.37548 
Fixed effects: Jbetatrend ~ temptrend_abs.sc + REALM + tempave.sc + tempave_metab.sc +      seas.sc + microclim.sc + mass.sc + speed.sc + lifespan.sc +      consumerfrac.sc + endothermfrac.sc + nspp.sc + temptrend.sc +      thermal_bias.sc + npp.sc + human.sc + temptrend_abs.sc:REALM +      temptrend_abs.sc:tempave.sc + temptrend_abs.sc:tempave_metab.sc +      temptrend_abs.sc:seas.sc + temptrend_abs.sc:microclim.sc +      temptrend_abs.sc:mass.sc + temptrend_abs.sc:speed.sc + temptrend_abs.sc:lifespan.sc +      temptrend_abs.sc:endothermfrac.sc + temptrend_abs.sc:nspp.sc +      temptrend.sc:thermal_bias.sc + temptrend_abs.sc:npp.sc +      temptrend_abs.sc:human.sc + REALM:human.sc + temptrend_abs.sc:REALM:human.sc 
 Correlation: 
                                           (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc spd.sc lfspn. cnsmr. endth. nspp.s tmptr. thrm_.
temptrend_abs.sc                            0.346                                                                                                           
REALMMarine                                -0.917 -0.317                                                                                                    
REALMTerrestrial                           -0.887 -0.313  0.813                                                                                             
tempave.sc                                 -0.002 -0.007 -0.009  -0.006                                                                                     
tempave_metab.sc                            0.039  0.010 -0.029  -0.029  -0.265                                                                             
seas.sc                                    -0.026 -0.002  0.038  -0.002   0.282 -0.083                                                                      
microclim.sc                               -0.004  0.002  0.010  -0.006   0.062  0.066  0.188                                                               
mass.sc                                     0.019  0.004 -0.006  -0.007   0.001 -0.549 -0.041 -0.013                                                        
speed.sc                                    0.013  0.003 -0.022  -0.016  -0.005  0.178 -0.080 -0.037 -0.136                                                 
lifespan.sc                                 0.023  0.012 -0.014  -0.026  -0.037  0.757  0.095  0.049 -0.801  0.277                                          
consumerfrac.sc                            -0.039 -0.038  0.051   0.304  -0.033 -0.055  0.004  0.014  0.047 -0.113 -0.089                                   
endothermfrac.sc                            0.152  0.069 -0.073  -0.308   0.057 -0.134  0.044  0.004  0.027  0.054 -0.021 -0.409                            
nspp.sc                                    -0.020  0.001 -0.001  -0.010  -0.048 -0.034 -0.026 -0.059 -0.150 -0.048  0.086  0.005  0.044                     
temptrend.sc                               -0.004 -0.007  0.004   0.006  -0.065 -0.019 -0.048 -0.017  0.015 -0.010 -0.012  0.011  0.004  0.020              
thermal_bias.sc                             0.022 -0.006 -0.032  -0.008   0.757 -0.033 -0.152 -0.127  0.038  0.017 -0.066 -0.005 -0.004 -0.112 -0.001       
npp.sc                                      0.002  0.000 -0.006  -0.005  -0.322  0.245 -0.265 -0.224 -0.013 -0.024  0.062 -0.057 -0.084 -0.165 -0.015 -0.135
human.sc                                   -0.131 -0.012  0.123   0.117   0.020 -0.009  0.013  0.017  0.003  0.001  0.005  0.012  0.000 -0.009  0.009  0.015
temptrend_abs.sc:REALMMarine               -0.328 -0.953  0.348   0.295   0.006 -0.004  0.010  0.000  0.002 -0.006 -0.008  0.037 -0.040 -0.008  0.005  0.005
temptrend_abs.sc:REALMTerrestrial          -0.308 -0.895  0.282   0.331  -0.003  0.001 -0.015 -0.008 -0.001  0.007  0.000  0.074 -0.102 -0.015  0.007  0.003
temptrend_abs.sc:tempave.sc                 0.000 -0.005 -0.002  -0.005   0.108 -0.063  0.050 -0.026 -0.033 -0.030  0.004 -0.015  0.019 -0.003 -0.077  0.008
temptrend_abs.sc:tempave_metab.sc           0.004  0.022  0.000   0.007   0.031  0.350  0.013  0.086 -0.216  0.084  0.315  0.001 -0.066 -0.028  0.002  0.098
temptrend_abs.sc:seas.sc                    0.009 -0.025 -0.004  -0.012   0.158  0.025  0.232  0.025 -0.035 -0.030  0.040  0.034  0.005 -0.010 -0.033  0.101
temptrend_abs.sc:microclim.sc              -0.002 -0.022  0.000  -0.002   0.010  0.101  0.054  0.277 -0.029  0.009  0.019  0.001 -0.027 -0.001  0.000 -0.022
temptrend_abs.sc:mass.sc                    0.003  0.006  0.002   0.001  -0.013 -0.288 -0.034 -0.020  0.496 -0.052 -0.407  0.025  0.013 -0.060  0.019  0.015
temptrend_abs.sc:speed.sc                  -0.009 -0.013  0.008   0.018  -0.007  0.028 -0.030  0.004 -0.017  0.216  0.059  0.012 -0.002 -0.025 -0.003  0.011
temptrend_abs.sc:lifespan.sc                0.002  0.024  0.002   0.007  -0.003  0.406  0.050  0.025 -0.409  0.117  0.507 -0.017 -0.055  0.039 -0.015 -0.015
temptrend_abs.sc:endothermfrac.sc           0.053  0.135 -0.024  -0.089  -0.030 -0.093 -0.003 -0.038  0.012 -0.007 -0.048 -0.091  0.356  0.046 -0.008 -0.064
temptrend_abs.sc:nspp.sc                    0.000  0.029 -0.005  -0.011  -0.037 -0.012  0.003  0.004 -0.067  0.000  0.056 -0.008  0.019  0.333  0.022 -0.069
                                           npp.sc hmn.sc tm_.:REALMM tm_.:REALMT tmptrnd_bs.sc:t. t_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                                                            
REALMMarine                                                                                                                                 
REALMTerrestrial                                                                                                                            
tempave.sc                                                                                                                                  
tempave_metab.sc                                                                                                                            
seas.sc                                                                                                                                     
microclim.sc                                                                                                                                
mass.sc                                                                                                                                     
speed.sc                                                                                                                                    
lifespan.sc                                                                                                                                 
consumerfrac.sc                                                                                                                             
endothermfrac.sc                                                                                                                            
nspp.sc                                                                                                                                     
temptrend.sc                                                                                                                                
thermal_bias.sc                                                                                                                             
npp.sc                                                                                                                                      
human.sc                                   -0.034                                                                                           
temptrend_abs.sc:REALMMarine               -0.006  0.012                                                                                    
temptrend_abs.sc:REALMTerrestrial           0.013  0.012  0.846                                                                             
temptrend_abs.sc:tempave.sc                -0.033 -0.003  0.004      -0.002                                                                 
temptrend_abs.sc:tempave_metab.sc           0.029 -0.001 -0.013      -0.001      -0.650                                                     
temptrend_abs.sc:seas.sc                   -0.181  0.000  0.045      -0.032       0.245           -0.012                                    
temptrend_abs.sc:microclim.sc              -0.126  0.001  0.032      -0.006      -0.024            0.000  0.059                             
temptrend_abs.sc:mass.sc                    0.006  0.011  0.006       0.003      -0.054           -0.405 -0.027             0.015           
temptrend_abs.sc:speed.sc                   0.008  0.010 -0.007       0.046      -0.043            0.075 -0.050            -0.046           
temptrend_abs.sc:lifespan.sc                0.019 -0.006 -0.017       0.000      -0.006            0.624  0.051             0.017           
temptrend_abs.sc:endothermfrac.sc          -0.021 -0.002 -0.082      -0.242       0.393           -0.422  0.012             0.004           
temptrend_abs.sc:nspp.sc                   -0.027 -0.012 -0.046      -0.061       0.044           -0.021 -0.045            -0.178           
                                           tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:l. tmptrnd_bs.sc:nd. tmptrnd_bs.sc:ns. tm.:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                                                                            
REALMMarine                                                                                                                                                 
REALMTerrestrial                                                                                                                                            
tempave.sc                                                                                                                                                  
tempave_metab.sc                                                                                                                                            
seas.sc                                                                                                                                                     
microclim.sc                                                                                                                                                
mass.sc                                                                                                                                                     
speed.sc                                                                                                                                                    
lifespan.sc                                                                                                                                                 
consumerfrac.sc                                                                                                                                             
endothermfrac.sc                                                                                                                                            
nspp.sc                                                                                                                                                     
temptrend.sc                                                                                                                                                
thermal_bias.sc                                                                                                                                             
npp.sc                                                                                                                                                      
human.sc                                                                                                                                                    
temptrend_abs.sc:REALMMarine                                                                                                                                
temptrend_abs.sc:REALMTerrestrial                                                                                                                           
temptrend_abs.sc:tempave.sc                                                                                                                                 
temptrend_abs.sc:tempave_metab.sc                                                                                                                           
temptrend_abs.sc:seas.sc                                                                                                                                    
temptrend_abs.sc:microclim.sc                                                                                                                               
temptrend_abs.sc:mass.sc                                                                                                                                    
temptrend_abs.sc:speed.sc                  -0.048                                                                                                           
temptrend_abs.sc:lifespan.sc               -0.791             0.131                                                                                         
temptrend_abs.sc:endothermfrac.sc          -0.009             0.073            -0.072                                                                       
temptrend_abs.sc:nspp.sc                   -0.208            -0.146             0.176            0.107                                                      
                                           tmptrnd_bs.sc:h. REALMM: REALMT: t_.:REALMM:
temptrend_abs.sc                                                                       
REALMMarine                                                                            
REALMTerrestrial                                                                       
tempave.sc                                                                             
tempave_metab.sc                                                                       
seas.sc                                                                                
microclim.sc                                                                           
mass.sc                                                                                
speed.sc                                                                               
lifespan.sc                                                                            
consumerfrac.sc                                                                        
endothermfrac.sc                                                                       
nspp.sc                                                                                
temptrend.sc                                                                           
thermal_bias.sc                                                                        
npp.sc                                                                                 
human.sc                                                                               
temptrend_abs.sc:REALMMarine                                                           
temptrend_abs.sc:REALMTerrestrial                                                      
temptrend_abs.sc:tempave.sc                                                            
temptrend_abs.sc:tempave_metab.sc                                                      
temptrend_abs.sc:seas.sc                                                               
temptrend_abs.sc:microclim.sc                                                          
temptrend_abs.sc:mass.sc                                                               
temptrend_abs.sc:speed.sc                                                              
temptrend_abs.sc:lifespan.sc                                                           
temptrend_abs.sc:endothermfrac.sc                                                      
temptrend_abs.sc:nspp.sc                                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-6.8331929 -0.2344594  0.1396617  0.6505383  7.5299389 

Number of Observations: 43585
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   250                  43585 
summary(modTfullHornsimpreml)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.06559547 (Intr)
temptrend_abs.sc 0.01968657 0.566 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev:  0.00441256 0.3183541

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.239254 
Fixed effects: Horntrend ~ temptrend_abs.sc + REALM + tempave.sc + tempave_metab.sc +      seas.sc + microclim.sc + mass.sc + lifespan.sc + endothermfrac.sc +      nspp.sc + npp.sc + human.sc + temptrend_abs.sc:tempave.sc +      temptrend_abs.sc:tempave_metab.sc + temptrend_abs.sc:seas.sc +      temptrend_abs.sc:mass.sc + temptrend_abs.sc:lifespan.sc +      temptrend_abs.sc:endothermfrac.sc + temptrend_abs.sc:nspp.sc +      temptrend_abs.sc:npp.sc + temptrend_abs.sc:human.sc + REALM:human.sc 
 Correlation: 
                                  (Intr) tmpt_. REALMMr REALMTr tmpv.s tmpv_. ses.sc mcrcl. mss.sc lfspn. endth. nspp.s npp.sc hmn.sc tmptrnd_bs.sc:t.
temptrend_abs.sc                   0.111                                                                                                              
REALMMarine                       -0.896  0.057                                                                                                       
REALMTerrestrial                  -0.906 -0.042  0.815                                                                                                
tempave.sc                        -0.038 -0.010  0.032   0.022                                                                                        
tempave_metab.sc                   0.047  0.032 -0.030  -0.028  -0.454                                                                                
seas.sc                           -0.036 -0.002  0.043   0.008   0.541 -0.088                                                                         
microclim.sc                      -0.008  0.000  0.011  -0.008   0.196  0.037  0.109                                                                  
mass.sc                            0.025  0.020 -0.012  -0.018  -0.058 -0.513 -0.052 -0.004                                                           
lifespan.sc                        0.027  0.036 -0.008  -0.011   0.027  0.722  0.108  0.039 -0.802                                                    
endothermfrac.sc                   0.150  0.048 -0.064  -0.224   0.146 -0.211  0.046  0.015  0.039 -0.064                                             
nspp.sc                           -0.024 -0.034 -0.004  -0.009   0.049 -0.020 -0.051 -0.068 -0.168  0.109  0.060                                      
npp.sc                             0.011 -0.002 -0.012   0.000  -0.327  0.258 -0.301 -0.261 -0.008  0.049 -0.108 -0.172                               
human.sc                          -0.112 -0.022  0.103   0.100   0.014 -0.003  0.015  0.030  0.000  0.013  0.009 -0.010 -0.037                        
temptrend_abs.sc:tempave.sc        0.001 -0.013 -0.003   0.000   0.092 -0.049  0.012 -0.016 -0.044  0.014  0.026  0.000 -0.013 -0.006                 
temptrend_abs.sc:tempave_metab.sc -0.007  0.056  0.016   0.009  -0.038  0.299  0.046  0.100 -0.188  0.280 -0.075 -0.012  0.022  0.013 -0.668          
temptrend_abs.sc:seas.sc           0.012 -0.034 -0.029  -0.008   0.070  0.035  0.187  0.009 -0.038  0.051 -0.021 -0.011 -0.145 -0.005  0.148          
temptrend_abs.sc:mass.sc           0.013  0.042 -0.007  -0.012  -0.045 -0.247 -0.039 -0.021  0.444 -0.371  0.019 -0.054  0.013 -0.012 -0.065          
temptrend_abs.sc:lifespan.sc      -0.008  0.060  0.020   0.015   0.022  0.343  0.053  0.011 -0.366  0.454 -0.060  0.043  0.011  0.010  0.001          
temptrend_abs.sc:endothermfrac.sc  0.004 -0.039 -0.005   0.004   0.023 -0.105 -0.042 -0.068  0.005 -0.055  0.301  0.042 -0.006  0.005  0.543          
temptrend_abs.sc:nspp.sc          -0.028 -0.096  0.018   0.023   0.012  0.009 -0.014  0.057 -0.061  0.053  0.001  0.283 -0.036  0.003  0.053          
temptrend_abs.sc:npp.sc            0.022 -0.047 -0.026  -0.014  -0.105  0.117 -0.145 -0.101  0.012  0.010 -0.054 -0.018  0.308 -0.006 -0.162          
temptrend_abs.sc:human.sc         -0.012  0.008  0.019   0.011   0.001 -0.019 -0.022 -0.042  0.009 -0.006  0.018 -0.029 -0.040  0.029 -0.176          
REALMMarine:human.sc               0.113  0.023 -0.103  -0.100  -0.020  0.003 -0.025 -0.037  0.001 -0.014 -0.008  0.008  0.025 -0.998  0.004          
REALMTerrestrial:human.sc          0.112  0.022 -0.103  -0.100  -0.033  0.007 -0.031 -0.016  0.005 -0.019 -0.014  0.013  0.034 -0.997  0.007          
                                  t_.:_. tmptrnd_bs.sc:s. tmptrnd_bs.sc:m. tmptrnd_bs.sc:l. tmptrnd_bs.sc:nd. tmptrnd_bs.sc:ns. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                                                                 
REALMMarine                                                                                                                                      
REALMTerrestrial                                                                                                                                 
tempave.sc                                                                                                                                       
tempave_metab.sc                                                                                                                                 
seas.sc                                                                                                                                          
microclim.sc                                                                                                                                     
mass.sc                                                                                                                                          
lifespan.sc                                                                                                                                      
endothermfrac.sc                                                                                                                                 
nspp.sc                                                                                                                                          
npp.sc                                                                                                                                           
human.sc                                                                                                                                         
temptrend_abs.sc:tempave.sc                                                                                                                      
temptrend_abs.sc:tempave_metab.sc                                                                                                                
temptrend_abs.sc:seas.sc           0.044                                                                                                         
temptrend_abs.sc:mass.sc          -0.407 -0.024                                                                                                  
temptrend_abs.sc:lifespan.sc       0.616  0.060           -0.807                                                                                 
temptrend_abs.sc:endothermfrac.sc -0.569 -0.083           -0.019           -0.098                                                                
temptrend_abs.sc:nspp.sc          -0.004 -0.035           -0.221            0.217            0.127                                               
temptrend_abs.sc:npp.sc            0.145 -0.234           -0.022            0.051           -0.077            -0.259                             
temptrend_abs.sc:human.sc          0.101 -0.175            0.034           -0.032           -0.075            -0.094            -0.093           
REALMMarine:human.sc              -0.012  0.002            0.013           -0.011           -0.006            -0.004             0.001           
REALMTerrestrial:human.sc         -0.015  0.001            0.014           -0.013           -0.005             0.000             0.008           
                                  tmptrnd_bs.sc:h. REALMM:
temptrend_abs.sc                                          
REALMMarine                                               
REALMTerrestrial                                          
tempave.sc                                                
tempave_metab.sc                                          
seas.sc                                                   
microclim.sc                                              
mass.sc                                                   
lifespan.sc                                               
endothermfrac.sc                                          
nspp.sc                                                   
npp.sc                                                    
human.sc                                                  
temptrend_abs.sc:tempave.sc                               
temptrend_abs.sc:tempave_metab.sc                         
temptrend_abs.sc:seas.sc                                  
temptrend_abs.sc:mass.sc                                  
temptrend_abs.sc:lifespan.sc                              
temptrend_abs.sc:endothermfrac.sc                         
temptrend_abs.sc:nspp.sc                                  
temptrend_abs.sc:npp.sc                                   
temptrend_abs.sc:human.sc                                 
REALMMarine:human.sc              -0.006                  
REALMTerrestrial:human.sc         -0.033            0.995 

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.77259623 -0.36603342  0.04046067  0.55772869  6.71714363 

Number of Observations: 42586
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   218                  42586 

plot coefs for full Total and HM models

coefs2 <- summary(modTfullJbetasimpreml)$tTable
coefs3 <- summary(modTfullHornsimpreml)$tTable
varstoplot <- unique(c(rownames(coefs2), rownames(coefs3)))

rows1 <- which(!grepl('Intercept', varstoplot) | grepl(':', varstoplot)) # vars to plot in first graph
rows1_2 <- which(rownames(coefs2) %in% varstoplot[rows1]) # rows in coefs2
rows1_3 <- which(rownames(coefs3) %in% varstoplot[rows1]) # rows in coefs3
xlims1 <- range(c(coefs2[rows1_2,1] - coefs2[rows1_2,2], 
                  coefs2[rows1_2,1] + coefs2[rows1_2,2], 
                  coefs3[rows1_3,1] - coefs3[rows1_3,2], 
                  coefs3[rows1_3,1] + coefs3[rows1_3,2]))

cols <- c('black', 'grey') # for Jbeta and Horn models, respectively
offs1 <- 0.1 # offset vertically for the two models
offs2 <- 0.01 # offset vertically for the two models (plot 2)

par(las = 1, mai = c(0.5, 3, 0.1, 0.1))

plot(0,0, col = 'white', xlim=xlims1, ylim = c(1,length(rows1)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(rows1):1, labels = varstoplot[rows1], cex.axis = 0.7)
abline(v = 0, col = 'grey')
for(i in 1:length(rows1)){
  if(varstoplot[rows1[i]] %in% rownames(coefs2)){
    x = coefs2[rownames(coefs2) == varstoplot[rows1[i]], 1]
    se = coefs2[rownames(coefs2) == varstoplot[rows1[i]], 2]
    points(x, length(rows1) + 1 - i + offs1, pch = 16, col = cols[1])
    lines(x = c(x-se, x+se), y = c(length(rows1) + 1 - i + offs1, length(rows1) + 1 - i + offs1), col = cols[1])
  }
  if(varstoplot[rows1[i]] %in% rownames(coefs3)){
    x = coefs3[rownames(coefs3) == varstoplot[rows1[i]], 1]
    se = coefs3[rownames(coefs3) == varstoplot[rows1[i]], 2]
    points(x, length(rows1) + 1 - i - offs1, pch = 16, col = cols[2])
    lines(x = c(x-se, x+se), y = c(length(rows1) + 1 - i - offs1, length(rows1) + 1 - i - offs1), col = cols[2])
  }
}

NA
NA

Black is for Jaccard total turnover (pres/abs), grey is for Morisita-Horn turnover (considers abundance)

Plot coefficients from all full models

coefs <- as.data.table(summary(modTfull1)$tTable)
coefs2 <- as.data.table(summary(modTfullJbeta)$tTable)
coefs3 <- as.data.table(summary(modTfullHorn)$tTable)

coefs$mod <- 'Jtu'
coefs2$mod <- 'Jbeta'
coefs3$mod <- 'Horn'

coefs$var <- rownames(summary(modTfull1)$tTable)
coefs2$var <- rownames(summary(modTfullJbeta)$tTable)
coefs3$var <- rownames(summary(modTfullHorn)$tTable)

# extract temperature effects and bind model coefs together
cols <- c('var', 'Value', 'Std.Error', 'mod')

allcoefsfull <- rbind(coefs[grep('temptrend|REALM', var), ..cols], 
                      coefs2[grep('temptrend|REALM', var), ..cols], 
                      coefs3[grep('temptrend|REALM', var), ..cols])
allcoefsfull$var[allcoefsfull$var == 'temptrend_abs.sc'] <- 'temptrend_abs.sc:REALMFreshwater'

# add average temperature effect (across realms) to realm-specific temperature effects
meantempeffect <- allcoefsfull[var %in% c('temptrend_abs.sc:REALMMarine', 'temptrend_abs.sc:REALMTerrestrial'), mean(Value), by = mod]$V1
allcoefsfull[var == 'temptrend_abs.sc:REALMMarine', Value := Value - meantempeffect]
allcoefsfull[var == 'temptrend_abs.sc:REALMTerrestrial', Value := Value - meantempeffect]
allcoefsfull[var == 'temptrend_abs.sc:REALMFreshwater', Value := -meantempeffect]

# add base temperature:human effect (freshwater) to realm-specific temperature:human effects
allcoefsfull$Value[allcoefsfull$var == 'temptrend_abs.sc:REALMMarine:human.sc'] <- with(allcoefsfull, Value[var == 'temptrend_abs.sc:REALMMarine:human.sc'] + Value[var == 'temptrend_abs.sc:human.sc'])
allcoefsfull$Value[allcoefsfull$var == 'temptrend_abs.sc:REALMTerrestrial:human.sc'] <- with(allcoefsfull, Value[var == 'temptrend_abs.sc:REALMTerrestrial:human.sc'] + Value[var == 'temptrend_abs.sc:human.sc'])


# remove non-temperature effects
allcoefsfull <- allcoefsfull[grepl(':', allcoefsfull$var) & grepl('temptrend', allcoefsfull$var), ]

# add info for plotting
allcoefsfull$lCI <- allcoefsfull$Value - allcoefsfull$Std.Error # lower confidence interval
allcoefsfull$uCI <- allcoefsfull$Value + allcoefsfull$Std.Error
nvar <- nrow(allcoefsfull)/3
allcoefsfull$y <- 1:nvar + rep(c(0, 0.1, 0.2), c(nvar, nvar, nvar)) # y-values

allcoefsfull$varname <- gsub('temptrend_abs.sc:|temptrend.sc:', '', allcoefsfull$var)
allcoefsfull$varname <- gsub('REALM', '', allcoefsfull$varname)
allcoefsfull$varname <- gsub('.sc', '', allcoefsfull$varname)
allcoefsfull$varname <- gsub('^human$', 'Freshwater:human', allcoefsfull$varname)

xlims1 <- c(-0.02, 0.02) # for realms
xlims2 <- c(-0.01, 0.015) # for traits
xlims3 <- c(-0.004, 0.0025) # for environment
xlims4 <- c(-0.016, 0.005) # for community
xlims5 <- c(-0.01, 0.015) # for human

ddg <- 0.5 # dodge for each model

set1 <- c('Terrestrial', 'Marine', 'Freshwater')
set2 <- c('mass', 'speed', 'lifespan', 'consumerfrac', 'endothermfrac', 'tempave_metab')
set3 <- c('seas', 'microclim', 'tempave')
set4 <- c('npp', 'nspp', 'thermal_bias')
set5 <- c('Terrestrial:human', 'Marine:human', 'Freshwater:human')

p1 <- ggplot(subset(allcoefsfull, varname %in% set1), 
                    aes(varname, Value, group = mod, color = mod)) +
  geom_hline(yintercept = 0, linetype = 'dashed', color = 'light grey') +
  geom_errorbar(aes(ymin = lCI, ymax = uCI), width = 0, position = position_dodge(ddg)) + 
  geom_point(position = position_dodge(ddg)) + 
  labs(y = 'Interaction with temperature change effect', x = '', tag = 'A') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_flip(ylim = xlims1)

p2 <- ggplot(subset(allcoefsfull, varname %in% set2), 
                    aes(varname, Value, group = mod, color = mod)) +
  geom_hline(yintercept = 0, linetype = 'dashed', color = 'light grey') +
  geom_errorbar(aes(ymin = lCI, ymax = uCI), width = 0, position = position_dodge(ddg)) + 
  geom_point(position = position_dodge(ddg)) + 
  labs(y = 'Interaction with temperature change effect', x = '', tag = 'B') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_flip(ylim = xlims2)

p3 <- ggplot(subset(allcoefsfull, varname %in% set3), 
                    aes(varname, Value, group = mod, color = mod)) +
  geom_hline(yintercept = 0, linetype = 'dashed', color = 'light grey') +
  geom_errorbar(aes(ymin = lCI, ymax = uCI), width = 0, position = position_dodge(ddg)) + 
  geom_point(position = position_dodge(ddg)) + 
  labs(y = 'Interaction with temperature change effect', x = '', tag = 'C') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_flip(ylim = xlims3)

p4 <- ggplot(subset(allcoefsfull, varname %in% set4), 
                    aes(varname, Value, group = mod, color = mod)) +
  geom_hline(yintercept = 0, linetype = 'dashed', color = 'light grey') +
  geom_errorbar(aes(ymin = lCI, ymax = uCI), width = 0, position = position_dodge(ddg)) + 
  geom_point(position = position_dodge(ddg)) + 
  labs(y = 'Interaction with temperature change effect', x = '', tag = 'D') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_flip(ylim = xlims4)

p5 <- ggplot(subset(allcoefsfull, varname %in% set5), 
                    aes(varname, Value, group = mod, color = mod)) +
  geom_hline(yintercept = 0, linetype = 'dashed', color = 'light grey') +
  geom_errorbar(aes(ymin = lCI, ymax = uCI), width = 0, position = position_dodge(ddg)) + 
  geom_point(position = position_dodge(ddg)) + 
  labs(y = 'Interaction with temperature change effect', x = '', tag = 'E') +
  scale_color_grey() + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.position='none',
        axis.text=element_text(size=7),
        axis.title=element_text(size=7)) + 
  coord_flip(ylim = xlims5)

grid.arrange(p1, p2, p3, p4, p5, ncol = 2, layout_matrix = rbind(c(1,2), c(3,4), c(5, NA)))

NA
NA

To do

LS0tCnRpdGxlOiAnRHJpdmVycyBvZiB2YXJpYXRpb24gaW4gdGhlIGNvbW11bml0eSByZXNwb25zZSB0byB0ZW1wZXJhdHVyZSBjaGFuZ2UgYWNyb3NzIHJlYWxtcycKc3VidGl0bGU6ICcodXNpbmcgbWl4ZWQgZWZmZWN0cyBtb2RlbHMpJwpvdXRwdXQ6IAogICAgZ2l0aHViX2RvY3VtZW50OiBkZWZhdWx0CiAgICAjaHRtbF9kb2N1bWVudDogZGVmYXVsdAogICAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAotLS0KCkNvbGxhYm9yYXRvcnM6IFNoYW5lIEJsb3dlcywgSm9uIENoYXNlLCBIZWxtdXQgSGlsbGVicmFuZCwgTWljaGFlbCBCdXJyb3dzLCBBbWFuZGEgQmF0ZXMsIFVsaSBCcm9zZSwgQmVub2l0IEdhdXplbnMsIExhdXJhIEFudGFvCkFzc2lzdGFuY2U6IEthdGhlcmluZSBMZXcsIEpvc2VmIEhhdXNlcgoKIyBJbnRyb2R1Y3Rpb24KLSBDbGltYXRlIGNoYW5nZSBpcyBkcml2aW5nIGEgd2lkZXNwcmVhZCByZW9yZ2FuaXphdGlvbiBvZiBlY29sb2dpY2FsIGNvbW11bml0aWVzIGFyb3VuZCB0aGUgd29ybGQgKFBhcm1zZXNhbiAmIFlvaGUgMjAwMywgUG9sb2N6YW5za2EgZXQgYWwuIDIwMTMpLAotIGJ1dCB0aGUgaW1wYWN0cyBvZiBjbGltYXRlIGNoYW5nZSB2YXJ5IHN1YnN0YW50aWFsbHkgZnJvbSBvbmUgbG9jYXRpb24gdG8gYW5vdGhlciBhbmQgYW1vbmcgdGF4YSAoTW9saW5vcyBldCBhbC4gMjAxNiBOQ0MsIEFudGFvIGV0IGFsLiAyMDIwIE5FRSkuCi0gQ29tbXVuaXR5IHJlb3JnYW5pemF0aW9uIGlzIHN1YnN0YW50aWFsbHkgbW9yZSBjb21tb24gdGhhbiBhbiBhZ2dyZWdhdGUgbG9zcyBvciBnYWluIG9mIHNwZWNpZXMgKERvcm5lbGFzIGV0IGFsLiAyMDE0IFNjaWVuY2UsIEJsb3dlcyBldCBhbC4gMjAxOSBTY2llbmNlLCBIaWxsZWJyYW5kIGV0IGFsLiAyMDE3IEogQXBwbCBFY29sKQotIFRoZXJlIGFyZSBtYW55IGh5cG90aGVzZXMgZm9yIHdoeSBzb21lIGNvbW11bml0aWVzIGFyZSBtb3JlIHNlbnNpdGl2ZSB0byB3YXJtaW5nIHRoYW4gb3RoZXJzLCBpbmNsdWRpbmcgZGlmZmVyZW5jZXMgaW4KICAtIG1ldGFib2xpYyByYXRlcyAoRGlsbG9uIGV0IGFsLiAyMDEwIE5hdHVyZSksIAogIC0gdGhlcm1hbCBwaHlzaW9sb2d5IChEZXV0c2NoIGV0IGFsLiAyMDA4IFBOQVMsIFBpbnNreSBldCBhbC4gMjAxOSBOYXR1cmUpLCAKICAtIG1pY3JvY2xpbWF0ZSBhdmFpbGFiaWxpdHkgKEJ1cnJvd3MgZXQgYWwuIDIwMTkgTkNDLCBTdWdnaXR0IGV0IGFsLiAyMDE4IE5DQyksCiAgLSBzcGVjaWVzIG1vYmlsaXR5IChQb2xvY3phbnNrYSBldCBhbC4gMjAxMyBOQ0MsIEJ1cnJvd3MgZXQgYWwuIDIwMTEgU2NpZW5jZSwgU3VuZGF5IGV0IGFsLiAyMDEyIE5DQykKICAtIG9yIGdlbmVyYXRpb24gdGltZSAoQmVhdWdyYW5kIGV0IGFsLiAyMDA5IERTUiBJSSwgUG9sb2N6YW5za2EgZXQgYWwuIDIwMTMgTkNDKSwKICAtIGNvbnN1bWVycyB2cy4gcHJvZHVjZXJzIChQZXRjaGV5IGV0IGFsLiAxOTk5IE5hdHVyZSkKICAtIGNvbW11bml0eSBjb21wb3NpdGlvbiAoU3R1YXJ0LVNtaXRoIGV0IGFsLiAyMDE1IE5hdHVyZSwgQmVhdWdyYW5kIGV0IGEuIDIwMTUgTkNDLCBUcmlzb3MgZXQgYWwuIDIwMjAgTmF0dXJlKSwgCiAgLSBlY29zeXN0ZW0gcHJvZHVjdGl2aXR5IChUaG9tYXMgZXQgYWwuIDIwMTcgR0NCLCBCcmV0dCAxOTcxIEFtIFpvbyksCiAgLSBleHBvc3VyZSB0byBodW1hbiBpbXBhY3RzIChXaGl0ZSAmIEtlcnIgMjAwNiBFY29ncmFwaHkpCiAgLSBhbmQgYW1vbmcgcmVhbG1zIChBbnRhbyBldCBhbC4gMjAyMCBORUUpLgotIFNjYWxpbmcgdXAgZnJvbSBvcmdhbmlzbWFsIGVmZmVjdHMgdG8gd2hvbGUgZWNvbG9naWNhbCBjb21tdW5pdGllcyBpcyBjb21wbGV4LCBhbmQgeWV0IHRoZXNlIHNjYWxlcyBhcmUgY3JpdGljYWwgZm9yIGVjb3N5c3RlbSBmdW5jdGlvbmluZyBhbmQgaHVtYW4gd2VsbC1iZWluZy4gCi0gVGhlcmUgaXMgYSBuZWVkIGZvciBhIGNvbXByZWhlbnNpdmUgdGVzdCB0byB1bmRlcnN0YW5kIHdoZXJlIHdhcm1pbmcgaXMgZHJpdmluZyBhbmQgaXMgbGlrZWx5IHRvIGRyaXZlIHRoZSBtb3N0IGRyYW1hdGljIGNvbW11bml0eSB0dXJub3ZlcgoKIyBNZXRob2RzCi0gQmlvVGltZSBkYXRhc2V0LCBncmlkZGVkIHRvIDk2IGttMiBoZXhhZ29ucywgc3VtbWFyaXplZCBhcyB0ZW1wb3JhbCB0dXJub3ZlciAoQmxvd2VzKQogIC0gVGVtcG9yYWwgc2xvcGUgb2YgSmFjY2FyZCB0dXJub3ZlciBjb21wYXJlZCB0byB0aGUgZmlyc3QgeWVhcgogIC0gU2FtZSBmb3IgSmFjY2FyZCB0b3RhbAogIC0gYW5kIE1vcmlzaXRhLUhvcm4gdHVybm92ZXIKLSBUZXN0ZWQgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGZvciBkaWZmZXJlbmNlcyBpbiByYXRlIG9mIHR1cm5vdmVyOgogIC0gVGVtcGVyYXR1cmUgdHJlbmQgb3ZlciB0aGUgdGltZS1mcmFtZSBvZiBlYWNoIHRpbWUtc2VyaWVzIChDUlUgVFMgNC4wMyBvbiBsYW5kIGFuZCBpbiBmcmVzaHdhdGVyLCBFUlNTVCB2NSBpbiB0aGUgb2NlYW4pCiAgLSBTZWFzb25hbGl0eSBhcyBhIG1ldHJpYyBvZiB0aGVybWFsIHNlbnNpdGl2aXR5IChEZXV0c2NoIGV0IGFsLiAyMDA4IFBOQVMpLiBTdGFuZGFyZCBkZXZpYXRpb24gb2YgbW9udGhseSB0ZW1wZXJhdHVyZXMuCiAgLSBBdmVyYWdlIHRlbXBlcmF0dXJlIGFzIGEgbWV0cmljIG9mIG1ldGFib2xpYyByYXRlcyAoRGlsbG9uIGV0IGFsLiAyMDEwIE5hdHVyZSwgQW50YW8gZXQgYWwuIDIwMjAgTmF0IEUmRSkKICAtIE1vYmlsaXR5IGNhbGN1bGF0ZWQgZnJvbSBib2R5IG1hc3MgYW5kIHRheG9ub21pYyBncm91cCBjbGFzc2lmaWNhdGlvbnMgb2YgbW9iaWxpdHkgbW9kZSAoZmx5LCBydW4sIHN3aW0sIGNyYXdsLCBzZXNzaWxlKS4gRmx5L3J1bi9zd2ltIGZvbGxvd2VkIHRoZSBhbGxvbWV0cmljIHJlbGF0aW9uc2hpcCBpbiBIaXJ0IGV0IGFsLiAyMDE3IE5hdCBFJkUuIENyYXdsIHNldCBhdCAwLjEga20vaHIsIHNlc3NpbGUgc2V0IHRvIDAga20vaHIuIFRoZW4gY2FsY3VsYXRlZCBhdmVyYWdlZCB3aXRoaW4gZWFjaCBhc3NlbWJsYWdlLgogIC0gTmV0IHByaW1hcnkgcHJvZHVjdGl2aXR5IChOUFApIGZyb20gdGhlIG1lcmdlZCBsYW5kL29jZWFuIHByb2R1Y3QgcHJvZHVjZWQgYnkgdGhlIFtPY2VhbiBQcm9kdWN0aXZpdHldKGh0dHA6Ly93d3cuc2NpZW5jZS5vcmVnb25zdGF0ZS5lZHUvb2NlYW4ucHJvZHVjdGl2aXR5LykgZ3JvdXAgYXQgT3JlZ29uIFN0YXRlIHVzaW5nIG1ldGhvZHMgZnJvbSBaaGFvIGV0IGFsLiAyMDA1IGFuZCBCZWhyZW5mZWxkICYgRmFsa293c2tpIDE5OTcuIAogLSBUTyBETzoKICAgLSBHZW5lcmF0aW9uIHRpbWUgY2FsY3VsYXRlZCBmcm9tIGJvZHkgbWFzcyBhbmQgZW5kb3RoZXJtIHZzLiBlY3RvdGhlcm0gY2xhc3NpZmljYXRpb25zLCBmb2xsb3dpbmcgTWNDb3kgJiBHaWxsb29seSAyMDA4IEVMRS4gQXZlcmFnZWQgYWNyb3NzIHNwZWNpZXMgd2l0aGluIGVhY2ggYXNzZW1ibGFnZS4gCiAgIC0gSHVtYW4gaW1wYWN0IGNhbGN1bGF0ZWQgZnJvbSBDYXJzdGVuIE1leWVyJ3MgZWNvc3lzdGVtIGN1YmUgZGF0YQogICAtIFRoZXJtYWwgYmlhcyBjYWxjdWxhdGVkIGZyb20gU3BlY2llcyBUZW1wZXJhdHVyZSBJbmRpY2VzIChNaWtlIEJ1cnJvd3MpCiAgIC0gTWljcm9jbGltYXRlcyBjYWxjdWxhdGVkIGZyb20gV29ybGRDbGltIGFuZCBCaW9PcmFjbGUgKExhdXJhIEFudGFvKQogICAtIENvbnN1bWVyIHZzLiBwcm9kdWNlciBjbGFzc2lmaWNhdGlvbgogLSBNYXliZSB0byBkbzoKICAgLSBTcGVjaWVzIHBvb2wgcmljaG5lc3MKLSBEaWZmZXJlbmNlcyBpbiB0ZW1wb3JhbCB0dXJub3ZlciAocmVzcG9uc2UgdmFyaWFibGUpIG1vZGVsZWQgd2l0aCBhIGxpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIChubG1lIHBhY2thZ2UsIGxtZSgpIGZ1bmN0aW9uKS4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkgIyBmb3IgaGFuZGxpbmcgbGFyZ2UgZGF0YXNldHMKbGlicmFyeShnZ3Bsb3QyKSAjIGZvciBzb21lIHBsb3R0aW5nCiNsaWJyYXJ5KGxtZTQpCmxpYnJhcnkobmxtZSkgIyBmb3IgTUUgbW9kZWxzCmxpYnJhcnkoYmVhbnBsb3QpICMgZm9yIGJlYW5wbG90cwpsaWJyYXJ5KG1hcHMpICMgZm9yIG1hcApsaWJyYXJ5KGdnZWZmZWN0cykgIyBtYXJnaW5hbCBlZmZlY3QgcGxvdHMKbGlicmFyeShncmlkRXh0cmEpICMgdG8gY29tYmluZSBnZ3Bsb3RzIHRvZ2V0aGVyCmxpYnJhcnkoZ3JpZCkgIyB0byBjb21iaW5lIGdncGxvdHMgdG9nZXRoZXIKbGlicmFyeShncmlkRXh0cmEpCgpvcHRpb25zKHdpZHRoPTUwMCkgIyB0dXJuIG9mZiBtb3N0IHRleHQgd3JhcHBpbmcKCiMgdGVsbCBSU3R1ZGlvIHRvIHVzZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IGFzIHRoZSByb290IGZvciB0aGlzIG5vdGVib29rLiBOZWVkZWQgc2luY2Ugd2UgYXJlIHN0b3JpbmcgY29kZSBpbiBhIHNlcGFyYXRlIGRpcmVjdG9yeS4Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSBycHJvanJvb3Q6OmZpbmRfcnN0dWRpb19yb290X2ZpbGUoKSkgCmBgYAoKYGBge3IgbG9hZCBkYXRhfQojIFR1cm5vdmVyIGFuZCBjb3ZhcmlhdGVzIGFzc2VtYmxlZCBieSB0dXJub3Zlcl92c190ZW1wZXJhdHVyZV9wcmVwLlJtZAp0cmVuZHMgPC0gZnJlYWQoJ291dHB1dC90dXJub3Zlcl93X2NvdmFyaWF0ZXMuY3N2Lmd6JykKCiMgc2V0IHJlYWxtIG9yZGVyCnRyZW5kc1ssIFJFQUxNIDo9IGZhY3RvcihSRUFMTSwgbGV2ZWxzID0gYygnRnJlc2h3YXRlcicsICdNYXJpbmUnLCAnVGVycmVzdHJpYWwnKSwgb3JkZXJlZCA9IEZBTFNFKV0KCiMgZ3JvdXAgTWFyaW5lIGludmVydGVicmF0ZXMvcGxhbnRzIGluIHdpdGggQWxsCnRyZW5kc1ssIHRheGFfbW9kMiA6PSB0YXhhX21vZF0KdHJlbmRzW3RheGFfbW9kID09ICdNYXJpbmUgaW52ZXJ0ZWJyYXRlcy9wbGFudHMnLCB0YXhhX21vZDIgOj0gJ0FsbCddCmBgYAoKTG9nLXRyYW5zZm9ybSBzb21lIHZhcmlhYmxlcywgdGhlbiBjZW50ZXIgYW5kIHNjYWxlLiAKYGBgIHtyIGNlbnRlciBhbmQgc2NhbGV9CnRyZW5kc1ssIHRlbXBhdmUuc2MgOj0gc2NhbGUodGVtcGF2ZSldCnRyZW5kc1ssIHRlbXBhdmVfbWV0YWIuc2MgOj0gc2NhbGUodGVtcGF2ZV9tZXRhYildCnRyZW5kc1ssIHNlYXMuc2MgOj0gc2NhbGUoc2VhcyldCnRyZW5kc1ssIG1pY3JvY2xpbS5zYyA6PSBzY2FsZShsb2cobWljcm9jbGltKSldCnRyZW5kc1ssIHRlbXB0cmVuZC5zYyA6PSBzY2FsZSh0ZW1wdHJlbmQpXQp0cmVuZHNbLCB0ZW1wdHJlbmRfYWJzLnNjIDo9IHNjYWxlKGxvZyhhYnModGVtcHRyZW5kKSkpXQp0cmVuZHNbLCBucHAuc2MgOj0gc2NhbGUobG9nKG5wcCkpXQp0cmVuZHNbLCBtYXNzLnNjIDo9IHNjYWxlKGxvZyhtYXNzX21lYW5fd2VpZ2h0KSldCnRyZW5kc1ssIHNwZWVkLnNjIDo9IHNjYWxlKGxvZyhzcGVlZF9tZWFuX3dlaWdodCsxKSldCnRyZW5kc1ssIGxpZmVzcGFuLnNjIDo9IHNjYWxlKGxvZyhsaWZlc3Bhbl9tZWFuX3dlaWdodCkpXQp0cmVuZHNbLCB0aGVybWFsX2JpYXMuc2MgOj0gc2NhbGUodGhlcm1hbF9iaWFzKV0KdHJlbmRzWywgY29uc3VtZXJmcmFjLnNjIDo9IHNjYWxlKGNvbnNmcmFjKV0KdHJlbmRzWywgZW5kb3RoZXJtZnJhYy5zYyA6PSBzY2FsZShlbmRvZnJhYyldCnRyZW5kc1ssIG5zcHAuc2MgOj0gc2NhbGUobG9nKE5zcHApKV0KdHJlbmRzWywgaHVtYW4uc2MgOj0gc2NhbGUoaHVtYW4pXQpgYGAKCiMjIyBEbyB0aGUgdmFyaWFibGVzIGxvb2sgb2s/CmBgYHtyIGhpc3RvZ3JhbXN9CiMgaGlzdG9ncmFtcyB0byBleGFtaW5lCmNleG1haW4gPSAwLjYKcGFyKG1mcm93ID0gYygzLDUpKQppbnZpc2libGUodHJlbmRzWywgaGlzdCh0ZW1wYXZlLnNjLCBtYWluID0gJ0Vudmlyb25tZW50YWwgdGVtcGVyYXR1cmUgKMKwQyknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QodGVtcGF2ZV9tZXRhYi5zYywgbWFpbiA9ICdNZXRhYm9saWMgdGVtcGVyYXR1cmUgKMKwQyknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3Qoc2Vhcy5zYywgbWFpbiA9ICdTZWFzb25hbGl0eSAowrBDKScsIGNleC5tYWluID0gY2V4bWFpbildKQppbnZpc2libGUodHJlbmRzWywgaGlzdChtaWNyb2NsaW0uc2MsIG1haW4gPSAnbG9nIE1pY3JvY2xpbWF0ZXMgKMKwQyknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QodGVtcHRyZW5kLnNjLCBtYWluID0gJ1RlbXBlcmF0dXJlIHRyZW5kICjCsEMveXIpJywgY2V4Lm1haW4gPSBjZXhtYWluKV0pCmludmlzaWJsZSh0cmVuZHNbLCBoaXN0KHRlbXB0cmVuZF9hYnMuc2MsIG1haW4gPSAnbG9nIGFicyhUZW1wZXJhdHVyZSB0cmVuZCkgKMKwQy95ciknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QobWFzcy5zYywgbWFpbiA9ICdsb2cgTWFzcyAoZyknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3Qoc3BlZWQuc2MsIG1haW4gPSAnbG9nIFNwZWVkIChrbS9ociknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QobGlmZXNwYW4uc2MsIG1haW4gPSAnbG9nIExpZmVzcGFuICh5ciknLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QoY29uc3VtZXJmcmFjLnNjLCBtYWluID0gJ0NvbnN1bWVycyAoZnJhY3Rpb24pJywgY2V4Lm1haW4gPSBjZXhtYWluKV0pCmludmlzaWJsZSh0cmVuZHNbLCBoaXN0KGVuZG90aGVybWZyYWMuc2MsIG1haW4gPSAnRW5kb3RoZXJtcyAoZnJhY3Rpb24pJywgY2V4Lm1haW4gPSBjZXhtYWluKV0pCmludmlzaWJsZSh0cmVuZHNbLCBoaXN0KG5zcHAuc2MsIG1haW4gPSAnbG9nIFNwZWNpZXMgcmljaG5lc3MnLCBjZXgubWFpbiA9IGNleG1haW4pXSkKaW52aXNpYmxlKHRyZW5kc1ssIGhpc3QodGhlcm1hbF9iaWFzLnNjLCBtYWluID0gJ1RoZXJtYWwgYmlhcyAowrBDKScsIGNleC5tYWluID0gY2V4bWFpbildKQppbnZpc2libGUodHJlbmRzWywgaGlzdChucHAuc2MsIG1haW4gPSAnbG9nIE5ldCBwcmltYXJ5IHByb2R1Y3Rpdml0eScsIGNleC5tYWluID0gY2V4bWFpbildKQppbnZpc2libGUodHJlbmRzWywgaGlzdChodW1hbi5zYywgbWFpbiA9ICdIdW1hbiBpbXBhY3Qgc2NvcmUnLCBjZXgubWFpbiA9IGNleG1haW4pXSkKCmBgYAoKIyMjIENoZWNrIGNvcnJlbGF0aW9ucyBhbW9uZyB2YXJpYWJsZXMuIFBlYXJzb24ncyByIGlzIG9uIHRoZSBsb3dlciBkaWFnb25hbC4KYGBge3IgcGFpcnMsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0KcGFuZWwuY29yIDwtIGZ1bmN0aW9uKHgsIHksIGRpZ2l0cyA9IDIsIHByZWZpeCA9ICIiLCBjZXguY29yLCAuLi4pCnsKICAgIHVzciA8LSBwYXIoInVzciIpOyBvbi5leGl0KHBhcih1c3IpKQogICAgcGFyKHVzciA9IGMoMCwgMSwgMCwgMSkpCiAgICByIDwtIGNvcih4LCB5LCB1c2UgPSAncGFpcndpc2UuY29tcGxldGUub2JzJykKICAgIHR4dCA8LSBmb3JtYXQoYyhyLCAwLjEyMzQ1Njc4OSksIGRpZ2l0cyA9IGRpZ2l0cylbMV0KICAgIHR4dCA8LSBwYXN0ZTAocHJlZml4LCB0eHQpCiAgICBpZihtaXNzaW5nKGNleC5jb3IpKSBjZXguY29yIDwtIDAuOC9zdHJ3aWR0aCh0eHQpCiAgICB0ZXh0KDAuNSwgMC41LCB0eHQpICMsIGNleCA9IGNleC5jb3IgKiByKQp9CnBhaXJzKGZvcm11bGEgPSB+IFJFQUxNICsgdGVtcGF2ZS5zYyArIHRlbXBhdmVfbWV0YWIuc2MgKyBzZWFzLnNjICsgbWljcm9jbGltLnNjICsgdGVtcHRyZW5kLnNjICsgdGVtcHRyZW5kX2Ficy5zYyArICBtYXNzLnNjICsgc3BlZWQuc2MgKyBsaWZlc3Bhbi5zYyArIGNvbnN1bWVyZnJhYy5zYyArIGVuZG90aGVybWZyYWMuc2MgKyBuc3BwLnNjICsgdGhlcm1hbF9iaWFzLnNjICsgbnBwLnNjICsgaHVtYW4uc2MsIGRhdGEgPSB0cmVuZHMsIGdhcCA9IDEvMTAsIGNleCA9IDAuMiwgY29sID0gJyMwMDAwMDAyMicsIGxvd2VyLnBhbmVsID0gcGFuZWwuY29yKQoKYGBgCgpNYXNzIGFuZCBsaWZlc3BhbiBsb29rIHRpZ2h0bHkgY29ycmVsYXRlZCwgYnV0IHIgb25seSAwLjU2Li4uPwpUZW1wYXZlX21ldGFiIGFuZCBsaWZlc3BhbiBkb24ndCBsb29rIHRpZ2h0bHkgY29ycmVsYXRlZCwgYnV0IHI9IC0wLjgxIApUZW1wYXZlX21ldGFiIGFuZCBzcGVlZCBkb24ndCBsb29rIHRpZ2h0bHkgY29ycmVsYXRlZCwgYnV0IHI9IC0wLjgzIApMaWZlc3BhbiBhbmQgc3BlZWQgZG9uJ3QgbG9vayB0aWdodGx5IGNvcnJlbGF0ZWQsIGJ1dCByID0gMC43MwoKCiMjIyBFeGFtaW5lIGhvdyBtYW55IGRhdGEgcG9pbnRzIGFyZSBhdmFpbGFibGUKSnVzdCB0dXJub3ZlcgpgYGB7ciBzYW1wbGUgc2l6ZSBhbGx9CmNhdCgnT3ZlcmFsbCAjIHRpbWUtc2VyaWVzOiAnLCBucm93KHRyZW5kcyksICdcbicpCmNhdCgnIyBzdHVkaWVzOiAnLCB0cmVuZHNbLCBsZW5ndGgodW5pcXVlKFNUVURZX0lEKSldLCAnXG4nKQpjYXQoJ0RhdGEgcG9pbnRzOiAnLCB0cmVuZHNbLCBzdW0obnlyQlQpXSwgJ1xuJykKdHJlbmRzWywgdGFibGUoUkVBTE0pXQp0cmVuZHNbLCB0YWJsZSh0YXhhX21vZCldCnRyZW5kc1ssIHRhYmxlKHRheGFfbW9kLCBSRUFMTSldCmBgYAoKV2l0aCBhbGwgY292YXJpYXRlcwpgYGB7ciBzYW1wbGUgc2l6ZSBmb3IgSmFjY2FyZCB0dXJub3Zlcn0KIyB0aGUgY2FzZXMgd2UgY2FuIGNvbXBhcmUKYXBwbHkodHJlbmRzWywgLihKdHV0cmVuZCwgUkVBTE0sIHRlbXBhdmUuc2MsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgdGVtcHRyZW5kLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgbGlmZXNwYW4uc2MsIGNvbnN1bWVyZnJhYy5zYywgZW5kb3RoZXJtZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIGh1bWFuLnNjKV0sIE1BUkdJTiA9IDIsIEZVTiA9IGZ1bmN0aW9uKHgpIHN1bSghaXMubmEoeCkpKQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kLCB0ZW1wdHJlbmQuc2MsIHRlbXBhdmVfbWV0YWIuc2MsIFJFQUxNLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIG5wcC5zYywgbWFzcy5zYywgc3BlZWQuc2MsIGxpZmVzcGFuLnNjLCBjb25zdW1lcmZyYWMuc2MsIHRoZXJtYWxfYmlhcy5zYyldCmNhdCgnT3ZlcmFsbCAjIHRpbWUtc2VyaWVzOiAnLCBzdW0oaSksICdcbicpCmNhdCgnIyBzdHVkaWVzOiAnLCB0cmVuZHNbaSwgbGVuZ3RoKHVuaXF1ZShTVFVEWV9JRCkpXSwgJ1xuJykKY2F0KCdEYXRhIHBvaW50czogJywgdHJlbmRzW2ksIHN1bShueXJCVCldLCAnXG4nKQp0cmVuZHNbaSwgdGFibGUoUkVBTE0pXQp0cmVuZHNbaSwgdGFibGUodGF4YV9tb2QpXQp0cmVuZHNbaSwgdGFibGUodGF4YV9tb2QsIFJFQUxNKV0KYGBgCgojIyMgQ2hvb3NlIHRoZSB2YXJpYW5jZSBzdHJ1Y3R1cmUgZm9yIG1peGVkIGVmZmVjdHMgbW9kbGVzClRyeSBjb21iaW5hdGlvbnMgb2YKCi0gdmFyaWFuY2Ugc2NhbGVkIHRvIGEgcG93ZXIgb2YgdGhlIG51bWJlciBvZiB5ZWFycyBpbiB0aGUgY29tbXVuaXR5IHRpbWUtc2VyaWVzCi0gdmFyaWFuY2Ugc2NhbGVkIHRvIGEgcG93ZXIgb2YgdGhlIGFicyB0ZW1wZXJhdHVyZSB0cmVuZAotIHJhbmRvbSBpbnRlcmNlcHQgZm9yIHRheGFfbW9kCi0gcmFuZG9tIGludGVyY2VwdCBmb3IgU1RVRFlfSUQKLSByYW5kb20gc2xvcGUgKGFicyB0ZW1wZXJhdHVyZSB0cmVuZCkgZm9yIHRheGFfbW9kCi0gcmFuZG9tIHNsb3BlIChhYnMgdGVtcGVyYXR1cmUgdHJlbmQpIGZvciBTVFVEWV9JRAotIHJhbmRvbSBpbnRlcmNlcHQgZm9yIHJhcmVmeUlEIChmb3Igb3ZlcmRpc3BlcnNpb24pCgpBbmQgY2hvb3NlIHRoZSBvbmUgd2l0aCBsb3dlc3QgQUlDIChub3QgcnVuOiB0YWtlcyBhIGxvbmcgdGltZSkKYGBge3IgY2hvb3NlIHZhcmlhbmNlIHN0cnVjdHVyZSBmb3IgSmFjYXJkIHR1cm5vdmVyLCBldmFsID0gRkFMU0V9CiMgZml0IG1vZGVscyBmb3IgdmFyaWFuY2Ugc3RydWN0dXJlCmZpeGVkIDwtIGZvcm11bGEoSnR1dHJlbmQgfiBSRUFMTSArIHRlbXBhdmVfbWV0YWIuc2MgKyBzZWFzLnNjICsgbWljcm9jbGltLnNjICsgbnBwLnNjICsgdGVtcHRyZW5kX2Ficy5zYyArCiAgICAgICAgICAgICAgICAgICAgIG1hc3Muc2MgKyBzcGVlZC5zYyArIGxpZmVzcGFuLnNjICsgY29uc3VtZXJmcmFjLnNjICsgdGhlcm1hbF9iaWFzLnNjKQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCBucHAuc2MsIHRlbXB0cmVuZF9hYnMuc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzcy5zYywgc3BlZWQuc2MsIGxpZmVzcGFuLnNjLCBjb25zdW1lcmZyYWMuc2MsIHRoZXJtYWxfYmlhcy5zYyldCm1vZHMgPC0gdmVjdG9yKCdsaXN0JywgMCkKbW9kc1tbMV1dIDwtIGdscyhmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0pCm1vZHNbWzJdXSA8LSBnbHMoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKbW9kc1tbM11dIDwtIGdscyhmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHdlaWdodHMgPSB2YXJQb3dlcigwLjUsIH4gYWJzKHRlbXB0cmVuZCkpKQoKbW9kc1tbNF1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfHRheGFfbW9kMiwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzVdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXxTVFVEWV9JRCwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzZdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQptb2RzW1s3XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8U1RVRFlfSUQvcmFyZWZ5SUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQptb2RzW1s4XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8dGF4YV9tb2QyL1NUVURZX0lEL3JhcmVmeUlELCBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAib3B0aW0iKSkKCm1vZHNbWzldXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+dGVtcHRyZW5kX2Ficy5zYyB8IHRheGFfbW9kKQptb2RzW1sxMF1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH50ZW1wdHJlbmRfYWJzLnNjIHwgU1RVRFlfSUQpCm1vZHNbWzExXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfnRlbXB0cmVuZF9hYnMuc2MgfCB0YXhhX21vZDIvU1RVRFlfSUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQptb2RzW1sxMl1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpKSAjIGluY2x1ZGVzIG92ZXJkaXNwZXJzaW9uLiBuZXcgZm9ybXVsYSBzbyB0aGF0IHJhbmRvbSBzbG9wZSBpcyBvbmx5IGZvciBzdHVkeSBsZXZlbCAobm90IGVub3VnaCBkYXRhIHRvIGV4dGVuZCB0byByYXJlZnlJRCkuCm1vZHNbWzEzXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKSkgIyAzMCsgbWluIHRvIGZpdAoKbW9kc1tbMTRdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXxTVFVEWV9JRCwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpCm1vZHNbWzE1XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8dGF4YV9tb2QyLCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKbW9kc1tbMTZdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQsIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+bnlyQlQpKQptb2RzW1sxN11dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfFNUVURZX0lEL3JhcmVmeUlELCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKbW9kc1tbMThdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQvcmFyZWZ5SUQsIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+bnlyQlQpKQptb2RzW1sxOV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH50ZW1wdHJlbmRfYWJzLnNjfFNUVURZX0lELCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKSkKbW9kc1tbMjBdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpCm1vZHNbWzIxXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiAxKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpCm1vZHNbWzIyXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiAxLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpCm1vZHNbWzIzXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpICMgc2luZ3VsYXIgcHJlY2lzaW9uIHdhcm5pbmcgd2l0aCBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScpIGFuZCBjb252ZXJnZW5jZSBlcnJvciB3aXRob3V0Cm1vZHNbWzI0XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpICMgc2luZ3VsYXIgcHJlY2lzaW9uIHdhcm5pbmcgd2l0aCBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScpIGFuZCBjb252ZXJnZW5jZSBlcnJvciB3aXRob3V0Cgptb2RzW1syNV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfHRheGFfbW9kMiwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5hYnModGVtcHRyZW5kKSkpCm1vZHNbWzI2XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8U1RVRFlfSUQsIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+YWJzKHRlbXB0cmVuZCkpKQptb2RzW1syN11dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfFNUVURZX0lEL3JhcmVmeUlELCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfmFicyh0ZW1wdHJlbmQpKSkKbW9kc1tbMjhdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQvcmFyZWZ5SUQsIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+YWJzKHRlbXB0cmVuZCkpKQptb2RzW1syOV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH50ZW1wdHJlbmRfYWJzLnNjfFNUVURZX0lELCB3ZWlnaHRzID0gdmFyUG93ZXIoLTAuNSwgfmFicyh0ZW1wdHJlbmQpKSkKbW9kc1tbMzBdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+dGVtcHRyZW5kX2Ficy5zY3x0YXhhX21vZDIvU1RVRFlfSUQsIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+YWJzKHRlbXB0cmVuZCkpLCBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAib3B0aW0iKSkKbW9kc1tbMzFdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5hYnModGVtcHRyZW5kKSkpCm1vZHNbWzMyXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdCh0YXhhX21vZDIgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5hYnModGVtcHRyZW5kKSksIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKSAjIHNpbmd1bGFyIHByZWNpc2lvbiB3YXJuaW5nCgphaWNzIDwtIHNhcHBseShtb2RzLCBBSUMpCm1pbmFpY3MgPC0gYWljcyAtIG1pbihhaWNzKQptaW5haWNzCndoaWNoLm1pbihhaWNzKQpgYGAKQ2hvb3NlcyB0aGUgcmFuZG9tIHNsb3BlcyAodGVtcHRyZW5kX2FicykgJiBpbnRlcmNlcHRzIGZvciBTVFVEWV9JRCwgb3ZlcmRpc3BlcnNpb24sIGFuZCB2YXJpYW5jZSBzY2FsZWQgdG8gbnVtYmVyIG9mIHllYXJzLgpXZSBoYXZlbid0IGRlYWx0IHdpdGggcG90ZW50aWFsIHRlc3Rpbmcgb24gdGhlIGJvdW5kYXJ5IGlzc3VlcyBoZXJlIHlldC4KCiMgUmVzdWx0cwojIyBXaGVyZSBkbyB3ZSBoYXZlIGRhdGE/CmBgYHtyIG1hcH0Kd29ybGQgPC0gbWFwX2RhdGEoJ3dvcmxkJykKZ2dwbG90KHdvcmxkLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApKSArCiAgICBnZW9tX3BvbHlnb24oZmlsbCA9ICdsaWdodGdyYXknLCBjb2xvciA9ICd3aGl0ZScpICsKICAgIGdlb21fcG9pbnQoZGF0YSA9IHRyZW5kcywgYWVzKHJhcmVmeUlEX3gsIHJhcmVmeUlEX3ksIGdyb3VwID0gUkVBTE0sIGNvbG9yID0gUkVBTE0pLCBzaXplID0gMC41LCBhbHBoYSA9IDAuNCkgICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIiwgbmFtZSA9ICdSZWFsbScpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjApKSArCiAgbGFicyh4ID0gJ0xvbmdpdHVkZSAowrApJywgeSA9ICdMYXRpdHVkZSAowrApJykKYGBgCgpNb3N0bHkgbm9ydGhlcm4gaGVtaXNwaGVyZSwgYnV0IHNwcmVhZCBhbGwgb3Zlci4gTm8gc28gbXVjaCBpbiBBZnJpY2Egb3IgbXVjaCBvZiBBc2lhLgoKCiMjIFBsb3QgdHVybm92ZXIgdnMuIGV4cGxhbmF0b3J5IHZhcmlhYmxlcwpMaW5lcyBhcmUgZ2dwbG90IHNtb290aGVyIGZpdHMgYnkgcmVhbG0uCmBgYHtyIHBsb3QgdHVybm92ZXIgdiB0ZW1wIHRyZW5kLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0ID0gMTYsIGZpZy53aWR0aCA9IDksfQoKcDEgPC0gZ2dwbG90KHRyZW5kcywgYWVzKFJFQUxNLCBKdHV0cmVuZCkpICsKICBnZW9tX2JveHBsb3QobmEucm0gPSBUUlVFKSArIAogIGxhYnMoeCA9ICdSZWFsbScsIHkgPSAnSmFjY2FyZCB0dXJub3ZlciB0ZW1wb3JhbCB0cmVuZCcpCgpwMiA8LSBnZ3Bsb3QodHJlbmRzLCBhZXModGVtcGF2ZSwgSnR1dHJlbmQsIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuMiwgYWxwaGEgPSAwLjUsIG5hLnJtID0gVFJVRSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiksIG5hLnJtID0gVFJVRSwgY29sb3IgPSAnYmxhY2snKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIGxhYnMoeCA9ICdUZW1wZXJhdHVyZSAowrBDKScsIHkgPSAnSmFjY2FyZCB0dXJub3ZlciB0ZW1wb3JhbCB0cmVuZCcpCgpwMyA8LSBnZ3Bsb3QodHJlbmRzLCBhZXModGVtcGF2ZV9tZXRhYiwgSnR1dHJlbmQsIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuMiwgYWxwaGEgPSAwLjUsIG5hLnJtID0gVFJVRSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiksIG5hLnJtID0gVFJVRSwgY29sb3IgPSAnYmxhY2snKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIGxhYnMoeCA9ICdNZXRhYm9saWMgdGVtcGVyYXR1cmUgKMKwQyknLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDQgPC0gZ2dwbG90KHRyZW5kcywgYWVzKHNlYXMsIEp0dXRyZW5kLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIpLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJ2JsYWNrJykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBsYWJzKHggPSAnU2Vhc29uYWxpdHkgKMKwQyknLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDUgPC0gZ2dwbG90KHRyZW5kcywgYWVzKG1pY3JvY2xpbSwgSnR1dHJlbmQsIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuMiwgYWxwaGEgPSAwLjUsIG5hLnJtID0gVFJVRSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiksIG5hLnJtID0gVFJVRSwgY29sb3IgPSAnYmxhY2snKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIHNjYWxlX3hfbG9nMTAoKSArCiAgbGFicyh4ID0gJ01pY3JvY2xpbWF0ZSBhdmFpbGFiaWxpdHkgKMKwQyknLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDYgPC0gZ2dwbG90KHRyZW5kcywgYWVzKG1hc3NfbWVhbl93ZWlnaHQsIEp0dXRyZW5kLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIpLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJ2JsYWNrJykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBzY2FsZV94X2xvZzEwKCkgKwogIGxhYnMoeCA9ICdNYXNzIChnKSknLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDcgPC0gZ2dwbG90KHRyZW5kcywgYWVzKHNwZWVkX21lYW5fd2VpZ2h0KzEsIEp0dXRyZW5kLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIpLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJ2JsYWNrJykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBzY2FsZV94X2xvZzEwKCkgKwogIGxhYnMoeCA9ICdTcGVlZCAoa20gLyBocikpJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCnA4IDwtIGdncGxvdCh0cmVuZHMsIGFlcyhsaWZlc3Bhbl9tZWFuX3dlaWdodCwgSnR1dHJlbmQsIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuMiwgYWxwaGEgPSAwLjUsIG5hLnJtID0gVFJVRSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiksIG5hLnJtID0gVFJVRSwgY29sb3IgPSAnYmxhY2snKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIHNjYWxlX3hfbG9nMTAoKSArCiAgbGFicyh4ID0gJ0xpZmVzcGFuICh5cikpJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCnA5IDwtIGdncGxvdCh0cmVuZHMsIGFlcyhjb25zZnJhYywgSnR1dHJlbmQsIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuMiwgYWxwaGEgPSAwLjUsIG5hLnJtID0gVFJVRSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiwgayA9IDMpLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJ2JsYWNrJykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBsYWJzKHggPSAnRnJhY3Rpb24gY29uc3VtZXJzJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCnAxMCA8LSBnZ3Bsb3QodHJlbmRzLCBhZXMoZW5kb2ZyYWMsIEp0dXRyZW5kLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIsIGsgPSAzKSwgbmEucm0gPSBUUlVFLCBjb2xvciA9ICdibGFjaycpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsgCiAgbGFicyh4ID0gJ0ZyYWN0aW9uIGVuZG90aGVybXMnLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDExIDwtIGdncGxvdCh0cmVuZHMsIGFlcyhOc3BwLCBKdHV0cmVuZCwgc2l6ZSA9IG55ckJUKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gUkVBTE0pLCBzaXplID0gMC4yLCBhbHBoYSA9IDAuNSwgbmEucm0gPSBUUlVFKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnYW0nLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwgbmEucm0gPSBUUlVFLCBjb2xvciA9ICdibGFjaycpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsKICBsYWJzKHggPSAnTnVtYmVyIG9mIHNwZWNpZXMnLCB5ID0gJ0phY2NhcmQgdHVybm92ZXIgdGVtcG9yYWwgdHJlbmQnKQoKcDEyIDwtIGdncGxvdCh0cmVuZHMsIGFlcyh0aGVybWFsX2JpYXMsIEp0dXRyZW5kLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBSRUFMTSksIHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIpLCBuYS5ybSA9IFRSVUUsIGNvbG9yID0gJ2JsYWNrJykgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBsYWJzKHggPSAnVGhlcm1hbCBiaWFzICjCsEMpJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCnAxMyA8LSBnZ3Bsb3QodHJlbmRzLCBhZXMobnBwLCBKdHV0cmVuZCwgc2l6ZSA9IG55ckJUKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gUkVBTE0pLCBzaXplID0gMC4yLCBhbHBoYSA9IDAuNSwgbmEucm0gPSBUUlVFKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnYW0nLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwgbmEucm0gPSBUUlVFLCBjb2xvciA9ICdibGFjaycpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsKICBsYWJzKHggPSAnTmV0IHByaW1hcnkgcHJvZHVjdGl2aXR5IChtZyBDIC8gbTIgLyBkYXkpJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCnAxNCA8LSBnZ3Bsb3QodHJlbmRzLCBhZXMoaHVtYW4sIEp0dXRyZW5kLCBjb2xvciA9IFJFQUxNLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC4yLCBhbHBoYSA9IDAuNSwgbmEucm0gPSBUUlVFKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnYW0nLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiLCBrID0gNSksIG5hLnJtID0gVFJVRSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKyAKICBsYWJzKHggPSAnQm93bGVyIGh1bWFuIGltcGFjdCBzY29yZScsIHkgPSAnSmFjY2FyZCB0dXJub3ZlciB0ZW1wb3JhbCB0cmVuZCcpCgpwMTUgPC0gZ2dwbG90KHRyZW5kcywgYWVzKHRlbXB0cmVuZCwgSnR1dHJlbmQsIGNvbG9yID0gUkVBTE0sIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAwLjIsIGFscGhhID0gMC41LCBuYS5ybSA9IFRSVUUpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2dhbScsIGZvcm11bGEgPSB5IH4gcyh4LCBicyA9ICJjcyIpLCBuYS5ybSA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsgCiAgbGFicyh4ID0gJ1RlbXBlcmF0dXJlIHRyZW5kICjCsEMveXIpJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyIHRlbXBvcmFsIHRyZW5kJykKCiMgSmFjY2FyZCB0b3RhbCB0cmVuZCB2cy4gdGVtcGVyYXR1cmUgdHJlbmQgKGFjcm9zcyBhbGwgeWVhcnMpCnAxNiA8LSBnZ3Bsb3QodHJlbmRzLCBhZXModGVtcHRyZW5kLCBKYmV0YXRyZW5kLCBjb2xvciA9IFJFQUxNLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC4yLCBhbHBoYSA9IDAuNSwgbmEucm0gPSBUUlVFKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnYW0nLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwgbmEucm0gPSBUUlVFKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIGxhYnMoeCA9ICdUZW1wZXJhdHVyZSB0cmVuZCAowrBDL3llYXIpJywgeSA9ICdKYWNjYXJkIHRvdGFsIHRlbXBvcmFsIHRyZW5kJykKCgojIEhvcm4tTW9yaXNpdGEgdHVybm92ZXIgdHJlbmQgdnMuIHRlbXBlcmF0dXJlIHRyZW5kIChhY3Jvc3MgYWxsIHllYXJzKQpwMTcgPC0gZ2dwbG90KHRyZW5kcywgYWVzKHRlbXB0cmVuZCwgSG9ybnRyZW5kLCBjb2xvciA9IFJFQUxNLCBzaXplID0gbnlyQlQpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMC4yLCBhbHBoYSA9IDAuNSwgbmEucm0gPSBUUlVFKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICdnYW0nLCBmb3JtdWxhID0geSB+IHMoeCwgYnMgPSAiY3MiKSwgbmEucm0gPSBUUlVFKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSArIAogIGxhYnMoeCA9ICdUZW1wZXJhdHVyZSB0cmVuZCAowrBDL3llYXIpJywgeSA9ICdNb3Jpc2l0YS1Ib3JuIHRlbXBvcmFsIHR1cm5vdmVyJykKCgpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgcDQsIHA1LCBwNiwgcDcsIHA4LCBwOSwgcDEwLCBwMTEsIHAxMiwgcDEzLCBwMTQsIHAxNSwgcDE2LCBwMTcsIG5jb2wgPSAyKQpgYGAKClN0cm9uZyB0cmVuZHMgd2l0aCB0ZW1wZXJhdHVyZSBjaGFuZ2UsIGJ1dCB0cmVuZHMgYXJlIHByZXR0eSBzeW1tZXRyaWMgYXJvdW5kIG5vIHRyZW5kIGluIHRlbXBlcmF0dXJlLCB3aGljaCBpbXBsaWVzIHdhcm1pbmcgb3IgY29vbGluZyBkcml2ZXMgc2ltaWxhciBkZWdyZWUgb2YgY29tbXVuaXR5IHR1cm5vdmVyLgpTb21lIGluZGljYXRpb24gb2YgbGVzcyB0dXJub3ZlciBmb3IgbGFyZ2VyIG9yZ2FuaXNtcyAobWFzcykKSGlnaGVyIHR1cm5vdmVyIG9uIGxhbmQgd2l0aCBoaWdoZXIgc2Vhc29uYWxpdHk/Ck1vcmUgdHVybm92ZXIgZm9yIHNob3J0ZXItbGl2ZWQgb3JnYW5pc21zPwpObyByZWFsbHkgY2xlYXIgZGlmZmVyZW5jZXMgYW1vbmcgcmVhbG1zLgoKCkF2ZXJhZ2UgcmF0ZXMgb2YgdHVybm92ZXIKYGBge3IgcmF0ZXMgb2YgdHVybm92ZXJ9CnRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjUsIC4obWVhbihKdHV0cmVuZCksIHNkKEp0dXRyZW5kKS9zcXJ0KC5OKSldICMgdHVybm92ZXIgcGVyIHllYXIgZm9yIGxvY2F0aW9ucyBjaGFuZ2luZyB0ZW1wZXJhdHVyZQp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPCAwLjEsIC4obWVhbihKdHV0cmVuZCksIHNkKEp0dXRyZW5kKS9zcXJ0KC5OKSldICMgbm90IGNoYW5naW5nIHRlbXBlcmF0dXJlCnRyZW5kc1t0ZW1wdHJlbmQgPj0gMC41LCAuKG1lYW4oSnR1dHJlbmQpLCBzZChKdHV0cmVuZCkvc3FydCguTikpXSAjIHdhcm1pbmcKdHJlbmRzW3RlbXB0cmVuZCA8PSAtMC41LCAuKG1lYW4oSnR1dHJlbmQpLCBzZChKdHV0cmVuZCkvc3FydCguTikpXSAjIGNvb2xpbmcKCnRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjUgJiBhYnMocmFyZWZ5SURfeSkgPCAzNSwgLihtZWFuKEp0dXRyZW5kKSwgc2QoSnR1dHJlbmQpL3NxcnQoLk4pKV0gIyB0cm9waWNzIGFuZCBzdWItdHJvcGljcwp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPj0gMC41ICYgYWJzKHJhcmVmeUlEX3kpID49IDM1ICYgYWJzKHJhcmVmeUlEX3kpIDwgNjYuNTYzMzksIC4obWVhbihKdHV0cmVuZCksIHNkKEp0dXRyZW5kKS9zcXJ0KC5OKSldICMgdGVtcGVyYXRlCnRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjUgJiBhYnMocmFyZWZ5SURfeSkgPj0gNjYuNTYzMzksIC4obWVhbihKdHV0cmVuZCksIHNkKEp0dXRyZW5kKS9zcXJ0KC5OKSldICMgYXJjdGljCmBgYAoKSGV4YWdvbmFsIGJpbnMKYGBge3IgdHVybm92ZXIgdnMuIHRlbXBlcmF0dXJlIGhleGJpbiwgZmlnLndpZHRoPTIsIGZpZy5oZWlnaHQ9MS41fQpyZXF1aXJlKGdncGxvdDIpCmdncGxvdCh0cmVuZHNbUkVBTE0gPT0gJ1RlcnJlc3RyaWFsJyxdLCBhZXModGVtcHRyZW5kLCBKdHV0cmVuZCkpICsKICBnZW9tX2hleCgpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudCh0cmFucyA9ICJsb2ciKQpnZ3Bsb3QodHJlbmRzW1JFQUxNID09ICdNYXJpbmUnLF0sIGFlcyh0ZW1wdHJlbmQsIEp0dXRyZW5kKSkgKwogIGdlb21faGV4KCkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gImxvZyIpCmdncGxvdCh0cmVuZHNbUkVBTE0gPT0gJ0ZyZXNod2F0ZXInLF0sIGFlcyh0ZW1wdHJlbmQsIEp0dXRyZW5kKSkgKwogIGdlb21faGV4KCkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gImxvZyIpCmBgYAoKCiMjIENvbXBhcmUgY292YXJpYXRlcyBhY3Jvc3MgcmVhbG1zCmBgYHtyIGNvbXBhcmUgYWNyb3NzIHJlYWxtcywgZmlnLmhlaWdodD0xMiwgZmlnLndpZHRoPTl9CmkgPC0gdHJlbmRzWywgIWR1cGxpY2F0ZWQocmFyZWZ5SUQpXTsgc3VtKGkpCnBhcihtZnJvdz1jKDUsMykpCmJlYW5wbG90KHJhcmVmeUlEX3kgfiBSRUFMTSwgZGF0YSA9IHRyZW5kc1tpLF0sIHdoYXQgPSBjKDEsMSwxLDEpLCBjb2wgPSBjKCIjQ0FCMkQ2IiwgIiMzM0EwMkMiLCAiI0IyREY4QSIpLCBib3JkZXIgPSAiI0NBQjJENiIsIHlsYWIgPSAnTGF0aXR1ZGUgKGRlZ04pJywgbGwgPSAwLjA1KQpiZWFucGxvdCh0ZW1wYXZlIH4gUkVBTE0sIGRhdGEgPSB0cmVuZHNbaSxdLCB3aGF0ID0gYygxLDEsMSwxKSwgY29sID0gYygiI0NBQjJENiIsICIjMzNBMDJDIiwgIiNCMkRGOEEiKSwgYm9yZGVyID0gIiNDQUIyRDYiLCB5bGFiID0gJ1RlbXBlcmF0dXJlIChkZWdDKScsIGxsID0gMC4wNSkKYmVhbnBsb3QodGVtcGF2ZV9tZXRhYiB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdNZXRhYm9saWMgVGVtcGVyYXR1cmUgKGRlZ0MpJywgbGwgPSAwLjA1LCBidyA9ICducmQwJykgIyBucmQwIGJhbmR3aWR0aCB0byBjYWxjdWxhdGlvbiBnYXAKYmVhbnBsb3Qoc2VhcyB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdTZWFzb25hbGl0eSAoZGVnQyknLCBsbCA9IDAuMDUpCmJlYW5wbG90KG1pY3JvY2xpbSB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdNaWNyb2NsaW1hdGVzIChkZWdDKScsIGxsID0gMC4wNSkKYmVhbnBsb3QodGVtcHRyZW5kIH4gUkVBTE0sIGRhdGEgPSB0cmVuZHNbaSxdLCB3aGF0ID0gYygxLDEsMSwxKSwgY29sID0gYygiI0NBQjJENiIsICIjMzNBMDJDIiwgIiNCMkRGOEEiKSwgYm9yZGVyID0gIiNDQUIyRDYiLCB5bGFiID0gJ1RlbXBlcmF0dXJlIHRyZW5kIChkZWdDL3lyKScsIGxsID0gMC4wNSkKYmVhbnBsb3QobWFzc19tZWFuX3dlaWdodCB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdNYXNzIChnKScsIGxsID0gMC4wNSwgbG9nID0gJ3knKQpiZWFucGxvdChzcGVlZF9tZWFuX3dlaWdodCArMSB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdTcGVlZCAoa20vaHIpJywgbGwgPSAwLjA1LCBsb2cgPSAneScpCmJlYW5wbG90KGxpZmVzcGFuX21lYW5fd2VpZ2h0IH4gUkVBTE0sIGRhdGEgPSB0cmVuZHNbaSxdLCB3aGF0ID0gYygxLDEsMSwxKSwgY29sID0gYygiI0NBQjJENiIsICIjMzNBMDJDIiwgIiNCMkRGOEEiKSwgYm9yZGVyID0gIiNDQUIyRDYiLCB5bGFiID0gJ0xpZmVzcGFuICh5ciknLCBsbCA9IDAuMDUsIGxvZyA9ICd5JykKI2JlYW5wbG90KGNvbnNmcmFjIH4gUkVBTE0sIGRhdGEgPSB0cmVuZHNbaSxdLCB3aGF0ID0gYygxLDEsMSwxKSwgY29sID0gYygiI0NBQjJENiIsICIjMzNBMDJDIiwgIiNCMkRGOEEiKSwgYm9yZGVyID0gIiNDQUIyRDYiLCB5bGFiID0gJ0NvbnN1bWVycyAoZnJhY3Rpb24pJywgbGwgPSAwLjA1LCBsb2cgPSAnJykgIyB0b28gc3BhcnNlCiNiZWFucGxvdChlbmRvZnJhYyB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdFbmRvdGhlcm1zIChmcmFjdGlvbiknLCBsbCA9IDAuMDUsIGxvZyA9ICcnKSAjIHRvbyBzcGFyc2UKYmVhbnBsb3QoTnNwcCB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdOdW1iZXIgb2Ygc3BlY2llcycsIGxsID0gMC4wNSwgbG9nID0gJ3knKQpiZWFucGxvdCh0aGVybWFsX2JpYXMgfiBSRUFMTSwgZGF0YSA9IHRyZW5kc1tpICYgIWlzLm5hKHRoZXJtYWxfYmlhcyksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdUaGVybWFsIGJpYXMgKGRlZ0MpJywgbGwgPSAwLjA1KQpiZWFucGxvdChucHAgfiBSRUFMTSwgZGF0YSA9IHRyZW5kc1tpLF0sIHdoYXQgPSBjKDEsMSwxLDEpLCBjb2wgPSBjKCIjQ0FCMkQ2IiwgIiMzM0EwMkMiLCAiI0IyREY4QSIpLCBib3JkZXIgPSAiI0NBQjJENiIsIHlsYWIgPSAnTlBQJywgbGwgPSAwLjA1KQpiZWFucGxvdChodW1hbiB+IFJFQUxNLCBkYXRhID0gdHJlbmRzW2ksXSwgd2hhdCA9IGMoMSwxLDEsMSksIGNvbCA9IGMoIiNDQUIyRDYiLCAiIzMzQTAyQyIsICIjQjJERjhBIiksIGJvcmRlciA9ICIjQ0FCMkQ2IiwgeWxhYiA9ICdIdW1hbiBpbXBhY3Qgc2NvcmUnLCBsbCA9IDAuMDUpCgpgYGAKCk1hcmluZSBhcmUgaW4gZ2VuZXJhbGx5IHdhcm1lciBsb2NhdGlvbnMgKHNlYXdhdGVyIGRvZXNuJ3QgZnJlZXplKQpNYXJpbmUgaGF2ZSBtdWNoIGxvd2VyIHNlYXNvbmFsaXR5LgpNYXJpbmUgYW5kIGZyZXNod2F0ZXIgaGF2ZSBzb21lIHZlcnkgc21hbGwgbWFzc2VzIChwbGFua3RvbiksIGJ1dCBtdWNoIG9mIGRhdGFzZXQgaXMgc2ltaWxhciB0byB0ZXJyZXN0cmlhbC4KTWFyaW5lIGhhcyBhIGxvdCBvZiBzbG93LCBjcmF3bGluZyBvcmdhbmlzbXMsIGJ1dCBsYW5kIGhhcyBwbGFudHMuIExhbmQgYWxzbyBoYXMgYmlyZHMgKGZhc3QpLgoKCgoKIyMgVGVtcGVyYXR1cmUtb25seSBtb2RlbCAoSnR1dHJlbmQsIEpiZXRhdHJlbmQsIEhvcm50cmVuZCkKYGBge3IgTE1FIEphY2FyZCB0dXJub3ZlciB0ZW1wZXJhdHVyZSBvbmx5fQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kLCBSRUFMTSwgdGVtcHRyZW5kKV0KCnJhbmRlZiA8LSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kIDwtIHJlYWRSRFMoJ3RlbXAvbW9kb25seVR0cmVuZC5yZHMnKQp9IGVsc2UgewogIG1vZG9ubHlUdHJlbmQgPC0gbG1lKEp0dXRyZW5kIH4gYWJzKHRlbXB0cmVuZCkqUkVBTE0sCiAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZG9ubHlUdHJlbmQsIGZpbGUgPSAndGVtcC9tb2Rvbmx5VHRyZW5kLnJkcycpCn0KCmkyIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEpiZXRhdHJlbmQsIFJFQUxNLCB0ZW1wdHJlbmQpXQppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kSmJldGEucmRzJykpewogIG1vZG9ubHlUdHJlbmRKYmV0YSA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRKYmV0YS5yZHMnKQp9IGVsc2UgewogIG1vZG9ubHlUdHJlbmRKYmV0YSA8LSBsbWUoSmJldGF0cmVuZCB+IGFicyh0ZW1wdHJlbmQpKlJFQUxNLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kb25seVR0cmVuZEpiZXRhLCBmaWxlID0gJ3RlbXAvbW9kb25seVR0cmVuZEpiZXRhLnJkcycpCn0KCmkzIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZCwgUkVBTE0sIHRlbXB0cmVuZCldCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZG9ubHlUdHJlbmRIb3JuLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kSG9ybiA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRIb3JuLnJkcycpCn0gZWxzZSB7CiAgbW9kb25seVR0cmVuZEhvcm4gPC0gbG1lKEhvcm50cmVuZCB+IGFicyh0ZW1wdHJlbmQpKlJFQUxNLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTMsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kb25seVR0cmVuZEhvcm4sIGZpbGUgPSAndGVtcC9tb2Rvbmx5VHRyZW5kSG9ybi5yZHMnKQp9CgpzdW1tYXJ5KG1vZG9ubHlUdHJlbmQpCnN1bW1hcnkobW9kb25seVR0cmVuZEpiZXRhKQpzdW1tYXJ5KG1vZG9ubHlUdHJlbmRIb3JuKQoKCmBgYAoKIyMjIFRyeSBzaW1wbGlmeWluZyB0aGUgdGVtcC1vbmx5IG1vZGVscwpgYGB7ciBzaW1wbGlmeSBtb2Rvbmx5VHRyZW5kfQppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kc2ltcHJlbWwucmRzJykpewogIG1vZG9ubHlUdHJlbmRzaW1wcmVtbCA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRzaW1wcmVtbC5yZHMnKQp9IGVsc2UgewogIHJlcXVpcmUoTUFTUykgIyBmb3Igc3RlcEFJQwogIG1vZG9ubHlUdHJlbmRtbCA8LSB1cGRhdGUobW9kb25seVR0cmVuZCwgbWV0aG9kID0gJ01MJykKICBtb2Rvbmx5VHRyZW5kc2ltcCA8LSBzdGVwQUlDKG1vZG9ubHlUdHJlbmRtbCwgZGlyZWN0aW9uID0gJ2JhY2t3YXJkJykKICBtb2Rvbmx5VHRyZW5kc2ltcHJlbWwgPC0gdXBkYXRlKG1vZG9ubHlUdHJlbmRzaW1wLCBtZXRob2QgPSAnUkVNTCcpCiAgc2F2ZVJEUyhtb2Rvbmx5VHRyZW5kc2ltcHJlbWwsIGZpbGUgPSAndGVtcC9tb2Rvbmx5VHRyZW5kc2ltcHJlbWwucmRzJykKfQoKCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZG9ubHlUdHJlbmRKYmV0YXNpbXByZW1sLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kSmJldGFzaW1wcmVtbCA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRKYmV0YXNpbXByZW1sLnJkcycpCn0gZWxzZSB7CiAgcmVxdWlyZShNQVNTKSAjIGZvciBzdGVwQUlDCiAgbW9kb25seVR0cmVuZEpiZXRhbWwgPC0gdXBkYXRlKG1vZG9ubHlUdHJlbmRKYmV0YSwgbWV0aG9kID0gJ01MJykKICBtb2Rvbmx5VHRyZW5kSmJldGFzaW1wIDwtIHN0ZXBBSUMobW9kb25seVR0cmVuZEpiZXRhbWwsIGRpcmVjdGlvbiA9ICdiYWNrd2FyZCcpCiAgbW9kb25seVR0cmVuZEpiZXRhc2ltcHJlbWwgPC0gdXBkYXRlKG1vZG9ubHlUdHJlbmRKYmV0YXNpbXAsIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZG9ubHlUdHJlbmRKYmV0YXNpbXByZW1sLCBmaWxlID0gJ3RlbXAvbW9kb25seVR0cmVuZEpiZXRhc2ltcHJlbWwucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kb25seVR0cmVuZEhvcm5zaW1wcmVtbC5yZHMnKSl7CiAgbW9kb25seVR0cmVuZEhvcm5zaW1wcmVtbCA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRIb3Juc2ltcHJlbWwucmRzJykKfSBlbHNlIHsKICByZXF1aXJlKE1BU1MpICMgZm9yIHN0ZXBBSUMKICBtb2Rvbmx5VHRyZW5kSG9ybm1sIDwtIHVwZGF0ZShtb2Rvbmx5VHRyZW5kSG9ybiwgbWV0aG9kID0gJ01MJykKICBtb2Rvbmx5VHRyZW5kSG9ybnNpbXAgPC0gc3RlcEFJQyhtb2Rvbmx5VHRyZW5kSG9ybm1sLCBkaXJlY3Rpb24gPSAnYmFja3dhcmQnKQogIG1vZG9ubHlUdHJlbmRIb3Juc2ltcHJlbWwgPC0gdXBkYXRlKG1vZG9ubHlUdHJlbmRIb3Juc2ltcCwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kb25seVR0cmVuZEhvcm5zaW1wcmVtbCwgZmlsZSA9ICd0ZW1wL21vZG9ubHlUdHJlbmRIb3Juc2ltcHJlbWwucmRzJykKfQoKc3VtbWFyeShtb2Rvbmx5VHRyZW5kc2ltcHJlbWwpCnN1bW1hcnkobW9kb25seVR0cmVuZEpiZXRhc2ltcHJlbWwpCnN1bW1hcnkobW9kb25seVR0cmVuZEhvcm5zaW1wcmVtbCkKCmBgYAoKIyMjIFBsb3QgdGhlIHRlbXAtb25seSBjb2VmZmljaWVudHMKYGBge3IgbW9kb25seVR0cmVuZHNpbXAgY29lZnN9CiMgbWFrZSB0YWJsZSBvZiBjb2VmZmljaWVudHMKY29lZnMgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG1vZG9ubHlUdHJlbmQpJHRUYWJsZSkKY29lZnMyIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2Rvbmx5VHRyZW5kSmJldGEpJHRUYWJsZSkKY29lZnMzIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2Rvbmx5VHRyZW5kSG9ybikkdFRhYmxlKQpjb2VmcyRtb2QgPC0gJ0p0dScKY29lZnMyJG1vZCA8LSAnSmJldGEnCmNvZWZzMyRtb2QgPC0gJ0hvcm4nCnJvd3MxIDwtIHdoaWNoKGdyZXBsKCd0ZW1wdHJlbmQnLCByb3duYW1lcyhjb2VmcykpKSAjIGV4dHJhY3QgdGVtcGVyYXR1cmUgZWZmZWN0CmNvbHMgPC0gYygnVmFsdWUnLCAnU3RkLkVycm9yJywgJ21vZCcpCmFsbGNvZWZzIDwtIHJiaW5kKGNvZWZzW3Jvd3MxLCBjb2xzXSwgY29lZnMyW3Jvd3MxLCBjb2xzXSwgY29lZnMzW3Jvd3MxLCBjb2xzXSkKYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNTWFyaW5lJywgcm93bmFtZXMoYWxsY29lZnMpKV0gPC0gCiAgYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNTWFyaW5lJywgcm93bmFtZXMoYWxsY29lZnMpKV0gKyAKICBhbGxjb2VmcyRWYWx1ZVshZ3JlcGwoJ1JFQUxNJywgcm93bmFtZXMoYWxsY29lZnMpKV0gIyBhZGQgaW50ZXJjZXB0IHRvIG1hcmluZSBlZmZlY3RzCmFsbGNvZWZzJFZhbHVlW2dyZXBsKCdSRUFMTVRlcnJlc3RyaWFsJywgcm93bmFtZXMoYWxsY29lZnMpKV0gPC0gCiAgYWxsY29lZnMkVmFsdWVbZ3JlcGwoJ1JFQUxNVGVycmVzdHJpYWwnLCByb3duYW1lcyhhbGxjb2VmcykpXSArIAogIGFsbGNvZWZzJFZhbHVlWyFncmVwbCgnUkVBTE0nLCByb3duYW1lcyhhbGxjb2VmcykpXSAjIGFkZCBpbnRlcmNlcHQgdG8gdGVycmVzdHJpYWwgZWZmZWN0cwoKYWxsY29lZnMkbENJIDwtIGFsbGNvZWZzJFZhbHVlIC0gYWxsY29lZnMkU3RkLkVycm9yICMgbG93ZXIgY29uZmlkZW5jZSBpbnRlcnZhbAphbGxjb2VmcyR1Q0kgPC0gYWxsY29lZnMkVmFsdWUgKyBhbGxjb2VmcyRTdGQuRXJyb3IKYWxsY29lZnMkeSA8LSBjKDMsIDIsIDEsIDIuOSwgMS45LCAwLjksIDIuOCwgMS44LCAwLjgpICMgeS12YWx1ZXMKYWxsY29lZnMkY29sIDwtIGMocmVwKCdibGFjaycsIDMpLCByZXAoJ2xpZ2h0IGdyZXknLCAzKSwgcmVwKCdkYXJrIGdyZXknLCAzKSkKYWxsY29lZnMkcmVhbG0gPC0gcmVwKGMoJ0ZyZXNod2F0ZXInLCAnTWFyaW5lJywgJ1RlcnJlc3RyaWFsJyksIDMpCgpwYXIobGFzID0gMSwgbWFpID0gYygwLjgsIDIsIDAuMSwgMC4xKSkKcGxvdCgwLDAsIGNvbCA9ICd3aGl0ZScsIHhsaW09YygtMC4wMiwgMC44NSksIHlsaW0gPSBjKDAuNywzKSwgCiAgICAgeWF4dD0nbicsIHhsYWIgPSAnVHVybm92ZXIgcGVyIHzCsEMveXJ8JywgeWxhYiA9JycpCmF4aXMoMiwgYXQgPSAzOjEsIGxhYmVscyA9IGMoJ0ZyZXNod2F0ZXInLCAnTWFyaW5lJywgJ1RlcnJlc3RyaWFsJyksIGNleC5heGlzID0gMC43KQphYmxpbmUodiA9IDAsIGNvbCA9ICdncmV5JykKZm9yKGkgaW4gMTpucm93KGFsbGNvZWZzKSl7CiAgd2l0aChhbGxjb2Vmc1tpLCBdLCBwb2ludHMoVmFsdWUsIHksIHBjaCA9IDE2LCBjb2wgPSBjb2wpKQogIHdpdGgoYWxsY29lZnNbaSwgXSwgbGluZXMoeCA9IGMobENJLCB1Q0kpLCB5ID0gYyh5LCB5KSwgY29sID0gY29sKSkKfQpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgY29sID0gYygnYmxhY2snLCAnZGFyayBncmV5JywgJ2xpZ2h0IGdyZXknKSwgbHdkID0gMSwgcGNoID0gMTYsIAogICAgICAgbGVnZW5kID0gYygnSmFjY2FyZCB0dXJub3ZlcicsICdKYWNjYXJkIHRvdGFsJywgJ0hvcm4tTW9yaXNpdGEnKSkKCmBgYAojIyMgTmljZXIgcGxvdHMgb2YgdHVybm92ZXIgdnMuIHRlbXBlcmF0dXJlIGRhdGEgYW5kIG1vZGVsIGZpdApTY2F0dGVycGxvdCwgdmlvbGluIHBsb3RzLCBhbmQgY29lZmZpY2llbnQgcGxvdHMgYWxsIHRvZ2V0aGVyCmBgYHtyIHR1cm5vdmVyIHZzLiB0ZW1wZXJhdHVyZSBiaWcgcGxvdCwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NS4yNX0KdHJlbmRzW3RlbXB0cmVuZCA8PSAtMC41LCB0ZW1wdHJlbmR0ZXh0IDo9ICdDb29saW5nJ10KdHJlbmRzW2Ficyh0ZW1wdHJlbmQpIDw9IDAuMSwgdGVtcHRyZW5kdGV4dCA6PSAnU3RhYmxlJ10KdHJlbmRzW3RlbXB0cmVuZCA+PSAwLjUsIHRlbXB0cmVuZHRleHQgOj0gJ1dhcm1pbmcnXQoKdHJlbmRzW2FicyhyYXJlZnlJRF95KSA8IDM1LCBsYXR6b25lIDo9ICdTdWJ0cm9waWNzJ10KdHJlbmRzW2FicyhyYXJlZnlJRF95KSA+PSAzNSAmIGFicyhyYXJlZnlJRF94KSA8IDY2LjU2MzM5LCBsYXR6b25lIDo9ICdUZW1wZXJhdGUnXSAKdHJlbmRzW2FicyhyYXJlZnlJRF95KSA+PSA2Ni41NjMzOSwgbGF0em9uZSA6PSAnUG9sYXInXQp0cmVuZHNbLCBsYXR6b25lIDo9IGZhY3RvcihsYXR6b25lLCBsZXZlbHMgPSBjKCdTdWJ0cm9waWNzJywgJ1RlbXBlcmF0ZScsICdQb2xhcicpKV0KCnAxIDwtIGdncGxvdCh0cmVuZHMsIGFlcyh0ZW1wdHJlbmQsIEp0dXRyZW5kLCBjb2xvciA9IFJFQUxNLCBmaWxsID0gUkVBTE0sIHNpemUgPSBueXJCVCkpICsKICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSwgc2hhcGUgPSAxNiwgYWxwaGEgPSAwLjEpICsgCiAgZ2VvbV9zbW9vdGgoZGF0YT1zdWJzZXQodHJlbmRzLCBhYnModGVtcHRyZW5kKSA8IDAuNzUpLCBtZXRob2QgPSAnZ2FtJywgZm9ybXVsYSA9IHkgfiBzKHgsIGJzID0gImNzIiksIAogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIiwgbmFtZSA9ICdSZWFsbScpICsgCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU2V0MSIsIG5hbWUgPSAnUmVhbG0nKSArIAogIGxhYnMoeCA9ICdUZW1wZXJhdHVyZSB0cmVuZCAowrBDL3lyKScsIHkgPSAnSmFjY2FyZCB0dXJub3ZlcicsIHRhZyA9ICdBJykgKwogIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSwgOCksIGJyZWFrcyA9IGMoMiwgNSwgMjApKSArCiAgZ3VpZGVzKHNpemUgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnWWVhcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlLmFlcyA9IGxpc3QobGluZXR5cGU9MCwgZmlsbCA9IE5BLCBhbHBoYSA9IDEpKSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC41LCJsaW5lIiksIAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT04KSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKSkKCnAyIDwtIGdncGxvdCh0cmVuZHNbIWlzLm5hKHRlbXB0cmVuZHRleHQpLCBdLCBhZXModGVtcHRyZW5kdGV4dCwgSnR1dHJlbmQpKSArCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKDAuMjUsIDAuNSwgMC43NSksIGZpbGwgPSAnZ3JleScpICsKICBsYWJzKHggPSAnJywgeSA9ICdKYWNjYXJkIHR1cm5vdmVyJywgdGFnID0gJ0InKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLmtleT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApKQoKcDMgPC0gZ2dwbG90KHRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjUgJiAhaXMubmEobGF0em9uZSksIF0sIGFlcyhsYXR6b25lLCBKdHV0cmVuZCkpICsKICBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IGMoMC4yNSwgMC41LCAwLjc1KSwgZmlsbCA9ICdncmV5JykgKyAKICBsYWJzKHggPSAnJywgeSA9ICcnLCB0YWcgPSAnQycpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQua2V5PWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NyksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCkpCgpwNCA8LSBnZ3Bsb3QoYWxsY29lZnMsIGFlcyhWYWx1ZSwgeSwgZ3JvdXAgPSBtb2QsIGNvbG9yID0gbW9kKSkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbENJLCB4bWF4ID0gdUNJLCBoZWlnaHQgPSAwKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBsYWJzKHggPSBleHByZXNzaW9uKGF0b3AoJ1RlbXBlcmF0dXJlIGNoYW5nZSBlZmZlY3QnLCAnKFR1cm5vdmVyICd+ZGVncmVlKidDJ14nLTEnKicpJykpLCB5ID0gJycsIHRhZyA9ICdEJykgKwogIHNjYWxlX2NvbG9yX2dyZXkoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScsCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9NykpICsgCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPWMoMCwgMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICcnLCBicmVha3MgPSBjKDEsIDIsIDMpLCBsYWJlbHMgPSBjKCdUZXJyZXN0cmlhbCcsICdNYXJpbmUnLCAnRnJlc2h3YXRlcicpKQoKZ3JpZC5hcnJhbmdlKHAxLCBwMiwgcDMsIHA0LCBuY29sID0gMywgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwxLDEpLCBjKDIsMyw0KSksCiAgICAgICAgICAgICBoZWlnaHRzPWModW5pdCgwLjY2LCAibnBjIiksIHVuaXQoMC4zNCwgIm5wYyIpKSkKYGBgCgojIyBGdWxsIG1vZGVscwpUcnkgc3RhdGljIGNvdmFyaWF0ZXMgcGx1cyBpbnRlcmFjdGlvbnMgb2YgYWJzIHRlbXBlcmF0dXJlIHRyZW5kIHdpdGggZWFjaCBjb3ZhcmlhdGU6CgotIHJlYWxtCi0gZW52aXJvbm1lbnRhbCB0ZW1wZXJhdHVyZQotIGF2ZXJhZ2UgbWV0YWJvbGljIHRlbXBlcmF0dXJlCi0gc2Vhc29uYWxpdHkKLSBtaWNyb2NsaW1hdGVzCi0gTlBQCi0gc3BlZWQKLSBtYXNzCi0gbGlmZXNwYW4KLSBjb25zdW1lciB2cy4gcHJvZHVjZXIKLSB0aGVybWFsIGJpYXMKCkV4Y2VwdCBmb3IgdGhlcm1hbCBiaWFzOiBpbnRlcmFjdCB3aXRoIHRlbXBlcmF0dXJlIHRyZW5kIChub3QgYWJzKQoKIyMjIEZ1bGwgbW9kZWwgZm9yIEphY2NhcmQgdG90YWwKYGBge3IgTE1FIEphY2FyZCB0dXJub3ZlciB0ZW1wZXJhdHVyZSBmdWxsfQppIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kLCBSRUFMTSwgdGVtcGF2ZS5zYywgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmQuc2MsIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCBsaWZlc3Bhbi5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjLCBlbmRvdGhlcm1mcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgaHVtYW4uc2MpXQoKcmFuZGVmIDwtIGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpCnZhcmVmIDwtIHZhclBvd2VyKC0wLjUsIH5ueXJCVCkKCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsMS5yZHMnKSl7CiAgbW9kVGZ1bGwxIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGwxLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGwxIDwtIGxtZShKdHV0cmVuZCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmxpZmVzcGFuLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyplbmRvdGhlcm1mcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kLnNjKnRoZXJtYWxfYmlhcy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbi5zYypSRUFMTSwKICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGwxLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGwxLnJkcycpCn0KCnN1bW1hcnkobW9kVGZ1bGwxKQoKCmBgYAoKCiMjIyMgVHJ5IHNpbXBsaWZ5aW5nIHRoZSBtb2RlbApgYGB7ciBzaW1wbGlmeSBtb2RUZnVsbDF9CmkgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSnR1dHJlbmQsIFJFQUxNLCB0ZW1wYXZlLnNjLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZC5zYywgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIGxpZmVzcGFuLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIGVuZG90aGVybWZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCBodW1hbi5zYyldCgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkKdmFyZWYgPC0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGwxc2ltcHJlbWwucmRzJykpewogIG1vZFRmdWxsMXNpbXByZW1sIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGwxc2ltcHJlbWwucmRzJykKfSBlbHNlIHsKICByZXF1aXJlKE1BU1MpICMgZm9yIHN0ZXBBSUMKICBtb2RUZnVsbDFtbCA8LSB1cGRhdGUobW9kVGZ1bGwxLCBtZXRob2QgPSAnTUwnKQogIG1vZFRmdWxsMXNpbXAgPC0gc3RlcEFJQyhtb2RUZnVsbDFtbCwgZGlyZWN0aW9uID0gJ2JhY2t3YXJkJykKICBtb2RUZnVsbDFzaW1wcmVtbCA8LSB1cGRhdGUobW9kVGZ1bGwxc2ltcCwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGwxc2ltcHJlbWwsIGZpbGUgPSAndGVtcC9tb2RUZnVsbDFzaW1wcmVtbC5yZHMnKQp9CnN1bW1hcnkobW9kVGZ1bGwxc2ltcHJlbWwpCgpgYGAKCgojIyMjIFBsb3QgdGhlIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBzaW1wbGlmaWVkIG1vZGVsCmBgYHtyIHBsb3QgZnVsbFRtb2Qxc2ltcHJlbWx9Cgpjb2VmcyA8LSBzdW1tYXJ5KG1vZFRmdWxsMXNpbXByZW1sKSR0VGFibGUKcGFyKGxhcyA9IDEsIG1haSA9IGMoMC41LCAzLCAwLjEsIDAuMSkpCnJvd3MxIDwtIHdoaWNoKCFncmVwbCgnSW50ZXJjZXB0Jywgcm93bmFtZXMoY29lZnMpKSkKcGxvdCgwLDAsIGNvbCA9ICd3aGl0ZScsIHhsaW09YygtMC4wMiwgMC4wOCksIHlsaW0gPSBjKDEsbGVuZ3RoKHJvd3MxKSksIHlheHQ9J24nLCB4bGFiID0gJycsIHlsYWIgPScnKQpheGlzKDIsIGF0ID0gbGVuZ3RoKHJvd3MxKToxLCBsYWJlbHMgPSByb3duYW1lcyhjb2Vmcylbcm93czFdLCBjZXguYXhpcyA9IDAuNykKYWJsaW5lKHYgPSAwLCBjb2wgPSAnZ3JleScpCmZvcihpIGluIDE6bGVuZ3RoKHJvd3MxKSl7CiAgeCA9IGNvZWZzW3Jvd3MxW2ldLCAxXQogIHNlID0gY29lZnNbcm93czFbaV0sIDJdCiAgcG9pbnRzKHgsIGxlbmd0aChyb3dzMSkgKyAxIC0gaSwgcGNoID0gMTYpCiAgbGluZXMoeCA9IGMoeC1zZSwgeCtzZSksIHkgPSBjKGxlbmd0aChyb3dzMSkgKyAxIC0gaSwgbGVuZ3RoKHJvd3MxKSArIDEgLSBpKSkKfQpgYGAKCiMjIyMgUGxvdCByZXNpZHVhbHMgYWdhaW5zdCBlYWNoIHByZWRpY3RvcgpgYGB7ciByZXNpZHMgbW9kVGZ1bGwxc2ltcCwgZmlnLmhlaWdodCA9IDEwLCBmaWcud2lkdGg9MTB9CnJlc2lkcyA8LSByZXNpZChtb2RUZnVsbDFzaW1wcmVtbCkKcHJlZHMgPC0gZ2V0RGF0YShtb2RUZnVsbDFzaW1wcmVtbCkKY29sID0gJyMwMDAwMDAzMycKY2V4ID0gMC41CnBhcihtZnJvdyA9IGMoNCw0KSkKYm94cGxvdChyZXNpZHMgfiBwcmVkcyRSRUFMTSwgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdGVtcHRyZW5kX2Ficy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0ZW1wdHJlbmQuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdGVtcGF2ZS5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0ZW1wYXZlX21ldGFiLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHNlYXMuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkbWljcm9jbGltLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJG1hc3Muc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkc3BlZWQuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkbGlmZXNwYW4uc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkY29uc3VtZXJmcmFjLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJGVuZG90aGVybWZyYWMuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkbnNwcC5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0aGVybWFsX2JpYXMuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkbnBwLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJGh1bWFuLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpgYGAKCiMjIyBTZW5zaXRpdml0eSBhbmFseXNpczogdG90YWwgdHVybm92ZXIgYW5kIEhvcm4tTW9yaXNpdGEgbW9kZWxzCiMjIyMgRml0IGZ1bGwgbW9kZWxzIGZvciB0b3RhbCBhbmQgSE0KYGBge3IgTE1FIEphY2FyZCB0b3RhbCBhbmQgTUggbW9kZWxzLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9OH0KaTIgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSmJldGF0cmVuZCwgUkVBTE0sIHRlbXBhdmUuc2MsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kLnNjLCB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgbGlmZXNwYW4uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgZW5kb3RoZXJtZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIGh1bWFuLnNjKV0KaTMgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSG9ybnRyZW5kLCBSRUFMTSwgdGVtcGF2ZS5zYywgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmQuc2MsIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCBsaWZlc3Bhbi5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjLCBlbmRvdGhlcm1mcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgaHVtYW4uc2MpXQoKcmFuZGVmIDwtIGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpCnZhcmVmIDwtIHZhclBvd2VyKC0wLjUsIH5ueXJCVCkKCiMgZnVsbCBtb2RlbHMKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxKYmV0YS5yZHMnKSl7CiAgbW9kVGZ1bGxKYmV0YSA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSmJldGEucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEpiZXRhIDwtIGxtZShKYmV0YXRyZW5kIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmUuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbGlmZXNwYW4uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmVuZG90aGVybWZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmQuc2MqdGhlcm1hbF9iaWFzLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuLnNjKlJFQUxNLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGxKYmV0YSwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSmJldGEucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxIb3JuLnJkcycpKXsKICBtb2RUZnVsbEhvcm4gPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbEhvcm4ucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm4gPC0gbG1lKEhvcm50cmVuZCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmxpZmVzcGFuLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyplbmRvdGhlcm1mcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kLnNjKnRoZXJtYWxfYmlhcy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbi5zYypSRUFMTSwKICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kzLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSG9ybiwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSG9ybi5yZHMnKQp9CgpzdW1tYXJ5KG1vZFRmdWxsSmJldGEpCnN1bW1hcnkobW9kVGZ1bGxIb3JuKQpgYGAKCiMjIyMgU2ltcGxpZnkgZnVsbCBUb3RhbCBhbmQgSE0gbW9kZWxzCmBgYHtyIHNpbXBsaWZ5IGZ1bGwgdG90YWwgYW5kIEhNIG1vZGVsc30KcmVxdWlyZShNQVNTKSAjIGZvciBzdGVwQUlDCgojIHNpbXBsaWZ5CmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZFRmdWxsSmJldGFzaW1wcmVtbC5yZHMnKSl7CiAgbW9kVGZ1bGxKYmV0YXNpbXByZW1sIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxKYmV0YXNpbXByZW1sLnJkcycpCn0gZWxzZSB7CiAgbW9kVGZ1bGxKYmV0YW1sIDwtIHVwZGF0ZShtb2RUZnVsbEpiZXRhLCBtZXRob2QgPSAnTUwnKQogIG1vZFRmdWxsSmJldGFzaW1wIDwtIHN0ZXBBSUMobW9kVGZ1bGxKYmV0YW1sLCBkaXJlY3Rpb24gPSAnYmFja3dhcmQnKQogIG1vZFRmdWxsSmJldGFzaW1wcmVtbCA8LSB1cGRhdGUobW9kVGZ1bGxKYmV0YXNpbXAsIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSmJldGFzaW1wcmVtbCwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSmJldGFzaW1wcmVtbC5yZHMnKQp9CgppZihmaWxlLmV4aXN0cygndGVtcC9tb2RUZnVsbEhvcm5zaW1wcmVtbC5yZHMnKSl7CiAgbW9kVGZ1bGxIb3Juc2ltcHJlbWwgPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbEhvcm5zaW1wcmVtbC5yZHMnKQp9IGVsc2UgewogIG1vZFRmdWxsSG9ybm1sIDwtIHVwZGF0ZShtb2RUZnVsbEhvcm4sIG1ldGhvZCA9ICdNTCcpCiAgbW9kVGZ1bGxIb3Juc2ltcCA8LSBzdGVwQUlDKG1vZFRmdWxsSG9ybm1sLCBkaXJlY3Rpb24gPSAnYmFja3dhcmQnKQogIG1vZFRmdWxsSG9ybnNpbXByZW1sIDwtIHVwZGF0ZShtb2RUZnVsbEhvcm5zaW1wLCBtZXRob2QgPSAnUkVNTCcpCiAgc2F2ZVJEUyhtb2RUZnVsbEhvcm5zaW1wcmVtbCwgZmlsZSA9ICd0ZW1wL21vZFRmdWxsSG9ybnNpbXByZW1sLnJkcycpCn0KCnN1bW1hcnkobW9kVGZ1bGxKYmV0YXNpbXByZW1sKQpzdW1tYXJ5KG1vZFRmdWxsSG9ybnNpbXByZW1sKQpgYGAKCiMjIyMgcGxvdCBjb2VmcyBmb3IgZnVsbCBUb3RhbCBhbmQgSE0gbW9kZWxzCmBgYHtyIHBsb3Qgc2ltcGxpZmllZCB0b3RhbCBhbmQgSE0gbW9kIGNvZWZzLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD02fQpjb2VmczIgPC0gc3VtbWFyeShtb2RUZnVsbEpiZXRhc2ltcHJlbWwpJHRUYWJsZQpjb2VmczMgPC0gc3VtbWFyeShtb2RUZnVsbEhvcm5zaW1wcmVtbCkkdFRhYmxlCnZhcnN0b3Bsb3QgPC0gdW5pcXVlKGMocm93bmFtZXMoY29lZnMyKSwgcm93bmFtZXMoY29lZnMzKSkpCgpyb3dzMSA8LSB3aGljaCghZ3JlcGwoJ0ludGVyY2VwdCcsIHZhcnN0b3Bsb3QpIHwgZ3JlcGwoJzonLCB2YXJzdG9wbG90KSkgIyB2YXJzIHRvIHBsb3QgaW4gZmlyc3QgZ3JhcGgKcm93czFfMiA8LSB3aGljaChyb3duYW1lcyhjb2VmczIpICVpbiUgdmFyc3RvcGxvdFtyb3dzMV0pICMgcm93cyBpbiBjb2VmczIKcm93czFfMyA8LSB3aGljaChyb3duYW1lcyhjb2VmczMpICVpbiUgdmFyc3RvcGxvdFtyb3dzMV0pICMgcm93cyBpbiBjb2VmczMKeGxpbXMxIDwtIHJhbmdlKGMoY29lZnMyW3Jvd3MxXzIsMV0gLSBjb2VmczJbcm93czFfMiwyXSwgCiAgICAgICAgICAgICAgICAgIGNvZWZzMltyb3dzMV8yLDFdICsgY29lZnMyW3Jvd3MxXzIsMl0sIAogICAgICAgICAgICAgICAgICBjb2VmczNbcm93czFfMywxXSAtIGNvZWZzM1tyb3dzMV8zLDJdLCAKICAgICAgICAgICAgICAgICAgY29lZnMzW3Jvd3MxXzMsMV0gKyBjb2VmczNbcm93czFfMywyXSkpCgpjb2xzIDwtIGMoJ2JsYWNrJywgJ2dyZXknKSAjIGZvciBKYmV0YSBhbmQgSG9ybiBtb2RlbHMsIHJlc3BlY3RpdmVseQpvZmZzMSA8LSAwLjEgIyBvZmZzZXQgdmVydGljYWxseSBmb3IgdGhlIHR3byBtb2RlbHMKb2ZmczIgPC0gMC4wMSAjIG9mZnNldCB2ZXJ0aWNhbGx5IGZvciB0aGUgdHdvIG1vZGVscyAocGxvdCAyKQoKcGFyKGxhcyA9IDEsIG1haSA9IGMoMC41LCAzLCAwLjEsIDAuMSkpCgpwbG90KDAsMCwgY29sID0gJ3doaXRlJywgeGxpbT14bGltczEsIHlsaW0gPSBjKDEsbGVuZ3RoKHJvd3MxKSksIHlheHQ9J24nLCB4bGFiID0gJycsIHlsYWIgPScnKQpheGlzKDIsIGF0ID0gbGVuZ3RoKHJvd3MxKToxLCBsYWJlbHMgPSB2YXJzdG9wbG90W3Jvd3MxXSwgY2V4LmF4aXMgPSAwLjcpCmFibGluZSh2ID0gMCwgY29sID0gJ2dyZXknKQpmb3IoaSBpbiAxOmxlbmd0aChyb3dzMSkpewogIGlmKHZhcnN0b3Bsb3Rbcm93czFbaV1dICVpbiUgcm93bmFtZXMoY29lZnMyKSl7CiAgICB4ID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtyb3dzMVtpXV0sIDFdCiAgICBzZSA9IGNvZWZzMltyb3duYW1lcyhjb2VmczIpID09IHZhcnN0b3Bsb3Rbcm93czFbaV1dLCAyXQogICAgcG9pbnRzKHgsIGxlbmd0aChyb3dzMSkgKyAxIC0gaSArIG9mZnMxLCBwY2ggPSAxNiwgY29sID0gY29sc1sxXSkKICAgIGxpbmVzKHggPSBjKHgtc2UsIHgrc2UpLCB5ID0gYyhsZW5ndGgocm93czEpICsgMSAtIGkgKyBvZmZzMSwgbGVuZ3RoKHJvd3MxKSArIDEgLSBpICsgb2ZmczEpLCBjb2wgPSBjb2xzWzFdKQogIH0KICBpZih2YXJzdG9wbG90W3Jvd3MxW2ldXSAlaW4lIHJvd25hbWVzKGNvZWZzMykpewogICAgeCA9IGNvZWZzM1tyb3duYW1lcyhjb2VmczMpID09IHZhcnN0b3Bsb3Rbcm93czFbaV1dLCAxXQogICAgc2UgPSBjb2VmczNbcm93bmFtZXMoY29lZnMzKSA9PSB2YXJzdG9wbG90W3Jvd3MxW2ldXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgocm93czEpICsgMSAtIGkgLSBvZmZzMSwgcGNoID0gMTYsIGNvbCA9IGNvbHNbMl0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHJvd3MxKSArIDEgLSBpIC0gb2ZmczEsIGxlbmd0aChyb3dzMSkgKyAxIC0gaSAtIG9mZnMxKSwgY29sID0gY29sc1syXSkKICB9Cn0KCgpgYGAKCkJsYWNrIGlzIGZvciBKYWNjYXJkIHRvdGFsIHR1cm5vdmVyIChwcmVzL2FicyksIGdyZXkgaXMgZm9yIE1vcmlzaXRhLUhvcm4gdHVybm92ZXIgKGNvbnNpZGVycyBhYnVuZGFuY2UpCgojIyMgUGxvdCBjb2VmZmljaWVudHMgZnJvbSBhbGwgZnVsbCBtb2RlbHMKYGBge3IgcGxvdCBjb2VmcyBmb3IgYWxsIG1vZGVscywgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Nn0KY29lZnMgPC0gYXMuZGF0YS50YWJsZShzdW1tYXJ5KG1vZFRmdWxsMSkkdFRhYmxlKQpjb2VmczIgPC0gYXMuZGF0YS50YWJsZShzdW1tYXJ5KG1vZFRmdWxsSmJldGEpJHRUYWJsZSkKY29lZnMzIDwtIGFzLmRhdGEudGFibGUoc3VtbWFyeShtb2RUZnVsbEhvcm4pJHRUYWJsZSkKCmNvZWZzJG1vZCA8LSAnSnR1Jwpjb2VmczIkbW9kIDwtICdKYmV0YScKY29lZnMzJG1vZCA8LSAnSG9ybicKCmNvZWZzJHZhciA8LSByb3duYW1lcyhzdW1tYXJ5KG1vZFRmdWxsMSkkdFRhYmxlKQpjb2VmczIkdmFyIDwtIHJvd25hbWVzKHN1bW1hcnkobW9kVGZ1bGxKYmV0YSkkdFRhYmxlKQpjb2VmczMkdmFyIDwtIHJvd25hbWVzKHN1bW1hcnkobW9kVGZ1bGxIb3JuKSR0VGFibGUpCgojIGV4dHJhY3QgdGVtcGVyYXR1cmUgZWZmZWN0cyBhbmQgYmluZCBtb2RlbCBjb2VmcyB0b2dldGhlcgpjb2xzIDwtIGMoJ3ZhcicsICdWYWx1ZScsICdTdGQuRXJyb3InLCAnbW9kJykKCmFsbGNvZWZzZnVsbCA8LSByYmluZChjb2Vmc1tncmVwKCd0ZW1wdHJlbmR8UkVBTE0nLCB2YXIpLCAuLmNvbHNdLCAKICAgICAgICAgICAgICAgICAgICAgIGNvZWZzMltncmVwKCd0ZW1wdHJlbmR8UkVBTE0nLCB2YXIpLCAuLmNvbHNdLCAKICAgICAgICAgICAgICAgICAgICAgIGNvZWZzM1tncmVwKCd0ZW1wdHJlbmR8UkVBTE0nLCB2YXIpLCAuLmNvbHNdKQphbGxjb2Vmc2Z1bGwkdmFyW2FsbGNvZWZzZnVsbCR2YXIgPT0gJ3RlbXB0cmVuZF9hYnMuc2MnXSA8LSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTUZyZXNod2F0ZXInCgojIGFkZCBhdmVyYWdlIHRlbXBlcmF0dXJlIGVmZmVjdCAoYWNyb3NzIHJlYWxtcykgdG8gcmVhbG0tc3BlY2lmaWMgdGVtcGVyYXR1cmUgZWZmZWN0cwptZWFudGVtcGVmZmVjdCA8LSBhbGxjb2Vmc2Z1bGxbdmFyICVpbiUgYygndGVtcHRyZW5kX2Ficy5zYzpSRUFMTU1hcmluZScsICd0ZW1wdHJlbmRfYWJzLnNjOlJFQUxNVGVycmVzdHJpYWwnKSwgbWVhbihWYWx1ZSksIGJ5ID0gbW9kXSRWMQphbGxjb2Vmc2Z1bGxbdmFyID09ICd0ZW1wdHJlbmRfYWJzLnNjOlJFQUxNTWFyaW5lJywgVmFsdWUgOj0gVmFsdWUgLSBtZWFudGVtcGVmZmVjdF0KYWxsY29lZnNmdWxsW3ZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTVRlcnJlc3RyaWFsJywgVmFsdWUgOj0gVmFsdWUgLSBtZWFudGVtcGVmZmVjdF0KYWxsY29lZnNmdWxsW3ZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTUZyZXNod2F0ZXInLCBWYWx1ZSA6PSAtbWVhbnRlbXBlZmZlY3RdCgojIGFkZCBiYXNlIHRlbXBlcmF0dXJlOmh1bWFuIGVmZmVjdCAoZnJlc2h3YXRlcikgdG8gcmVhbG0tc3BlY2lmaWMgdGVtcGVyYXR1cmU6aHVtYW4gZWZmZWN0cwphbGxjb2Vmc2Z1bGwkVmFsdWVbYWxsY29lZnNmdWxsJHZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTU1hcmluZTpodW1hbi5zYyddIDwtIHdpdGgoYWxsY29lZnNmdWxsLCBWYWx1ZVt2YXIgPT0gJ3RlbXB0cmVuZF9hYnMuc2M6UkVBTE1NYXJpbmU6aHVtYW4uc2MnXSArIFZhbHVlW3ZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpodW1hbi5zYyddKQphbGxjb2Vmc2Z1bGwkVmFsdWVbYWxsY29lZnNmdWxsJHZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTVRlcnJlc3RyaWFsOmh1bWFuLnNjJ10gPC0gd2l0aChhbGxjb2Vmc2Z1bGwsIFZhbHVlW3ZhciA9PSAndGVtcHRyZW5kX2Ficy5zYzpSRUFMTVRlcnJlc3RyaWFsOmh1bWFuLnNjJ10gKyBWYWx1ZVt2YXIgPT0gJ3RlbXB0cmVuZF9hYnMuc2M6aHVtYW4uc2MnXSkKCgojIHJlbW92ZSBub24tdGVtcGVyYXR1cmUgZWZmZWN0cwphbGxjb2Vmc2Z1bGwgPC0gYWxsY29lZnNmdWxsW2dyZXBsKCc6JywgYWxsY29lZnNmdWxsJHZhcikgJiBncmVwbCgndGVtcHRyZW5kJywgYWxsY29lZnNmdWxsJHZhciksIF0KCiMgYWRkIGluZm8gZm9yIHBsb3R0aW5nCmFsbGNvZWZzZnVsbCRsQ0kgPC0gYWxsY29lZnNmdWxsJFZhbHVlIC0gYWxsY29lZnNmdWxsJFN0ZC5FcnJvciAjIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwKYWxsY29lZnNmdWxsJHVDSSA8LSBhbGxjb2Vmc2Z1bGwkVmFsdWUgKyBhbGxjb2Vmc2Z1bGwkU3RkLkVycm9yCm52YXIgPC0gbnJvdyhhbGxjb2Vmc2Z1bGwpLzMKYWxsY29lZnNmdWxsJHkgPC0gMTpudmFyICsgcmVwKGMoMCwgMC4xLCAwLjIpLCBjKG52YXIsIG52YXIsIG52YXIpKSAjIHktdmFsdWVzCgphbGxjb2Vmc2Z1bGwkdmFybmFtZSA8LSBnc3ViKCd0ZW1wdHJlbmRfYWJzLnNjOnx0ZW1wdHJlbmQuc2M6JywgJycsIGFsbGNvZWZzZnVsbCR2YXIpCmFsbGNvZWZzZnVsbCR2YXJuYW1lIDwtIGdzdWIoJ1JFQUxNJywgJycsIGFsbGNvZWZzZnVsbCR2YXJuYW1lKQphbGxjb2Vmc2Z1bGwkdmFybmFtZSA8LSBnc3ViKCcuc2MnLCAnJywgYWxsY29lZnNmdWxsJHZhcm5hbWUpCmFsbGNvZWZzZnVsbCR2YXJuYW1lIDwtIGdzdWIoJ15odW1hbiQnLCAnRnJlc2h3YXRlcjpodW1hbicsIGFsbGNvZWZzZnVsbCR2YXJuYW1lKQoKeGxpbXMxIDwtIGMoLTAuMDIsIDAuMDIpICMgZm9yIHJlYWxtcwp4bGltczIgPC0gYygtMC4wMSwgMC4wMTUpICMgZm9yIHRyYWl0cwp4bGltczMgPC0gYygtMC4wMDQsIDAuMDAyNSkgIyBmb3IgZW52aXJvbm1lbnQKeGxpbXM0IDwtIGMoLTAuMDE2LCAwLjAwNSkgIyBmb3IgY29tbXVuaXR5CnhsaW1zNSA8LSBjKC0wLjAxLCAwLjAxNSkgIyBmb3IgaHVtYW4KCmRkZyA8LSAwLjUgIyBkb2RnZSBmb3IgZWFjaCBtb2RlbAoKc2V0MSA8LSBjKCdUZXJyZXN0cmlhbCcsICdNYXJpbmUnLCAnRnJlc2h3YXRlcicpCnNldDIgPC0gYygnbWFzcycsICdzcGVlZCcsICdsaWZlc3BhbicsICdjb25zdW1lcmZyYWMnLCAnZW5kb3RoZXJtZnJhYycsICd0ZW1wYXZlX21ldGFiJykKc2V0MyA8LSBjKCdzZWFzJywgJ21pY3JvY2xpbScsICd0ZW1wYXZlJykKc2V0NCA8LSBjKCducHAnLCAnbnNwcCcsICd0aGVybWFsX2JpYXMnKQpzZXQ1IDwtIGMoJ1RlcnJlc3RyaWFsOmh1bWFuJywgJ01hcmluZTpodW1hbicsICdGcmVzaHdhdGVyOmh1bWFuJykKCnAxIDwtIGdncGxvdChzdWJzZXQoYWxsY29lZnNmdWxsLCB2YXJuYW1lICVpbiUgc2V0MSksIAogICAgICAgICAgICAgICAgICAgIGFlcyh2YXJuYW1lLCBWYWx1ZSwgZ3JvdXAgPSBtb2QsIGNvbG9yID0gbW9kKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2xpZ2h0IGdyZXknKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxDSSwgeW1heCA9IHVDSSksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZShkZGcpKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZShkZGcpKSArIAogIGxhYnMoeSA9ICdJbnRlcmFjdGlvbiB3aXRoIHRlbXBlcmF0dXJlIGNoYW5nZSBlZmZlY3QnLCB4ID0gJycsIHRhZyA9ICdBJykgKwogIHNjYWxlX2NvbG9yX2dyZXkoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScsCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9NykpICsgCiAgY29vcmRfZmxpcCh5bGltID0geGxpbXMxKQoKcDIgPC0gZ2dwbG90KHN1YnNldChhbGxjb2Vmc2Z1bGwsIHZhcm5hbWUgJWluJSBzZXQyKSwgCiAgICAgICAgICAgICAgICAgICAgYWVzKHZhcm5hbWUsIFZhbHVlLCBncm91cCA9IG1vZCwgY29sb3IgPSBtb2QpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAnbGlnaHQgZ3JleScpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbENJLCB5bWF4ID0gdUNJKSwgd2lkdGggPSAwLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKGRkZykpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKGRkZykpICsgCiAgbGFicyh5ID0gJ0ludGVyYWN0aW9uIHdpdGggdGVtcGVyYXR1cmUgY2hhbmdlIGVmZmVjdCcsIHggPSAnJywgdGFnID0gJ0InKSArCiAgc2NhbGVfY29sb3JfZ3JleSgpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSdub25lJywKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NyksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyAKICBjb29yZF9mbGlwKHlsaW0gPSB4bGltczIpCgpwMyA8LSBnZ3Bsb3Qoc3Vic2V0KGFsbGNvZWZzZnVsbCwgdmFybmFtZSAlaW4lIHNldDMpLCAKICAgICAgICAgICAgICAgICAgICBhZXModmFybmFtZSwgVmFsdWUsIGdyb3VwID0gbW9kLCBjb2xvciA9IG1vZCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdsaWdodCBncmV5JykgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsQ0ksIHltYXggPSB1Q0kpLCB3aWR0aCA9IDAsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoZGRnKSkgKyAKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoZGRnKSkgKyAKICBsYWJzKHkgPSAnSW50ZXJhY3Rpb24gd2l0aCB0ZW1wZXJhdHVyZSBjaGFuZ2UgZWZmZWN0JywgeCA9ICcnLCB0YWcgPSAnQycpICsKICBzY2FsZV9jb2xvcl9ncmV5KCkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb249J25vbmUnLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTcpKSArIAogIGNvb3JkX2ZsaXAoeWxpbSA9IHhsaW1zMykKCnA0IDwtIGdncGxvdChzdWJzZXQoYWxsY29lZnNmdWxsLCB2YXJuYW1lICVpbiUgc2V0NCksIAogICAgICAgICAgICAgICAgICAgIGFlcyh2YXJuYW1lLCBWYWx1ZSwgZ3JvdXAgPSBtb2QsIGNvbG9yID0gbW9kKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2xpZ2h0IGdyZXknKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxDSSwgeW1heCA9IHVDSSksIHdpZHRoID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZShkZGcpKSArIAogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZShkZGcpKSArIAogIGxhYnMoeSA9ICdJbnRlcmFjdGlvbiB3aXRoIHRlbXBlcmF0dXJlIGNoYW5nZSBlZmZlY3QnLCB4ID0gJycsIHRhZyA9ICdEJykgKwogIHNjYWxlX2NvbG9yX2dyZXkoKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0nbm9uZScsCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9NykpICsgCiAgY29vcmRfZmxpcCh5bGltID0geGxpbXM0KQoKcDUgPC0gZ2dwbG90KHN1YnNldChhbGxjb2Vmc2Z1bGwsIHZhcm5hbWUgJWluJSBzZXQ1KSwgCiAgICAgICAgICAgICAgICAgICAgYWVzKHZhcm5hbWUsIFZhbHVlLCBncm91cCA9IG1vZCwgY29sb3IgPSBtb2QpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAnbGlnaHQgZ3JleScpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbENJLCB5bWF4ID0gdUNJKSwgd2lkdGggPSAwLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKGRkZykpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKGRkZykpICsgCiAgbGFicyh5ID0gJ0ludGVyYWN0aW9uIHdpdGggdGVtcGVyYXR1cmUgY2hhbmdlIGVmZmVjdCcsIHggPSAnJywgdGFnID0gJ0UnKSArCiAgc2NhbGVfY29sb3JfZ3JleSgpICsgCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSdub25lJywKICAgICAgICBheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NyksCiAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyAKICBjb29yZF9mbGlwKHlsaW0gPSB4bGltczUpCgpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgcDQsIHA1LCBuY29sID0gMiwgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwyKSwgYygzLDQpLCBjKDUsIE5BKSkpCgoKYGBgCgojIFRvIGRvCgo=